54 - Swift 之登录模块

声明:本次更新是对以往学习的知识进行复习。

一、 登录模块

                登录模块是每一个App的开发部分,在App中有着很重要的地位,同过登录,我们能获取用户的信息或者一些App使用特权等。

二 、本Demo 的展示

Simulator Screen Shot 2017年7月31日 下午3.57.36.png

三 、 本Demo 使用到的知识点总结

  • 图像的只适应存储它的容器

  • 图像多余,如何裁剪多余的区域

  • 定时器的使用

  • 旋转活动指示器的使用

  • 在异步线程中怎么回到主线程

  • 请求获取数据的解析

四、相关代码

1> 登录页面的布局

// TODO : 登录页面的布局
func makeLoginUI() -> Void {
    /**
     设置背景
     */
    let bGImageView = UIImageView.init(frame: self.view.frame)
    bGImageView.contentMode = UIViewContentMode.scaleAspectFill
    bGImageView.image = UIImage.init(named: "BgImageView")
    bGImageView.isUserInteractionEnabled = true
    self.view.addSubview(bGImageView)
    
    /**
     Heard ImageView
     */
    let heardImageV = UIImageView.init(frame: CGRect.init(x: 0, y: 0, width: 80, height: 80))
    heardImageV.center = CGPoint.init(x: self.view.center.x, y: 160)
    heardImageV.layer.masksToBounds = true
    heardImageV.image = UIImage.init(named: "HeaderImageV")
    heardImageV.layer.borderWidth = 6
    heardImageV.layer.backgroundColor = UIColor.cyan.cgColor
    heardImageV.layer.cornerRadius = heardImageV.bounds.width * 0.5
    heardImageV.contentMode = .scaleAspectFill
    bGImageView.addSubview(heardImageV)
    
    /**
     账号
     */
    let AccountLable = UILabel.init(frame: CGRect.init(x: 40, y:heardImageV.frame.maxY+30
, width: 40, height: 30))
    AccountLable.text = "账户:"
    bGImageView.addSubview(AccountLable)
    
    AccountTextField = UITextField.init(frame: CGRect.init(x: AccountLable.frame.maxX+10, y: heardImageV.frame.maxY + 32, width: bGImageView.frame.width - 90 - AccountLable.frame.width, height: 30))
    AccountTextField?.placeholder = "请输入您的账户"
    bGImageView.addSubview(AccountTextField!)
    
    let line = UIView.init(frame: CGRect.init(x: 40, y: AccountLable.frame.maxY, width: bGImageView.frame.width - 80, height: 1))
    line.backgroundColor = UIColor.gray
    bGImageView.addSubview(line)
    
    /**
     密码
     */
    let passWLable = UILabel.init(frame: CGRect.init(x: 40, y: line.frame.maxY+40, width: 40, height: 30))
    passWLable.text = "密码:"
    bGImageView.addSubview(passWLable)
    
    passWTextField = UITextField.init(frame: CGRect.init(x: passWLable.frame.maxX+10, y: line.frame.maxY + 42, width: bGImageView.frame.width - passWLable.frame.width - 90, height: 30))
    passWTextField?.placeholder = "请输入密码"
    bGImageView.addSubview(passWTextField!)
    
    let lineV = UIView .init(frame: CGRect.init(x: 40, y: passWLable.frame.maxY, width: bGImageView.frame.width - 80, height: 1))
    lineV.backgroundColor = UIColor.gray
    bGImageView.addSubview(lineV)

    /**
     点击按钮
     */
    let loginBtn = UIButton.init(frame: CGRect.init(x: 40, y: lineV.frame.maxY + 50, width: bGImageView.frame.width - 80, height: 40))
    loginBtn.setTitle("登录", for: .normal)
    loginBtn.setTitleColor(UIColor.black, for: .normal)
    loginBtn.layer.cornerRadius = 6
    loginBtn.addTarget(self, action:#selector(click(_:)), for:.touchUpInside)
    loginBtn.layer.borderColor = UIColor.gray.cgColor
    loginBtn.layer.borderWidth = 1
    bGImageView.addSubview(loginBtn)
}

2> 自动消失的提示

// TODO : 简短提示
func autoAlertView(message:String) -> Void {
    let autoAlert = UIAlertController.init(title: "", message: message, preferredStyle: .alert)
    self.present(autoAlert, animated: true) { 
        self.timer = Timer.init(timeInterval: 10, repeats: false, block: { (time) in
            autoAlert.dismiss(animated: true, completion:{
               self.timer?.invalidate()
            })
        })
        self.timer?.fire()
    }
}

3> 活动指示器的提示

// TODO : 活动指示器的提示
func activityIndicator(isFinsh:Bool) -> Void {
    if isFinsh {
        underView?.removeFromSuperview()
        return;
    }
    underView = UIView.init(frame: self.view.frame)
    underView?.backgroundColor = UIColor.clear
    self.view.addSubview(underView!)
    
    let activitV = UIActivityIndicatorView.init(frame: CGRect.init(x: 0, y: 0, width: 80, height: 80))
    activitV.center = CGPoint.init(x: underView!.center.x, y: underView!.center.y)
    activitV.backgroundColor = UIColor.gray
    activitV.activityIndicatorViewStyle = .whiteLarge
    activitV.layer.cornerRadius = 6
    underView?.addSubview(activitV)
    activitV.startAnimating()
}

4> 数据的下载

func loadData() -> Void {
    self.activityIndicator(isFinsh: false)
    let url = URL.init(string: "http://api.3g.ifeng.com/clientShortNews?type=beauty")
    let request = URLRequest.init(url: url!)
    let DataTask = URLSession.shared.dataTask(with: request) { (data, resp, error) in
        self.activityIndicator(isFinsh: true)
        if data != nil && error == nil {
            let dict = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
            DispatchQueue.main.async(execute: {
                 let  Vc = HomeViewController.init()
                 Vc.dataDictionary = (dict as! NSDictionary)
                 let NavVc = UINavigationController.init(rootViewController: Vc)
                 self.present(NavVc, animated: true, completion: nil)
            })
        }
    }
    DataTask.resume()
}

5> 本Demo的效果展示

Untitled.gif

6> 完整代码


import UIKit

class LoginViewController: UIViewController {

var AccountTextField:UITextField?
var passWTextField:UITextField?
var timer:Timer?
var underView:UIView?


override func viewDidLoad() {
    super.viewDidLoad()
    self.setNavition()
    self.makeLoginUI()
    // Do any additional setup after loading the view.
}

// TODO : 设置导航
func setNavition() -> Void {
    self.navigationItem.title = "登录"
}

// TODO : 登录页面的布局
func makeLoginUI() -> Void {
    /**
     设置背景
     */
    let bGImageView = UIImageView.init(frame: self.view.frame)
    bGImageView.contentMode = UIViewContentMode.scaleAspectFill
    bGImageView.image = UIImage.init(named: "BgImageView")
    bGImageView.isUserInteractionEnabled = true
    self.view.addSubview(bGImageView)
    
    /**
     Heard ImageView
     */
    let heardImageV = UIImageView.init(frame: CGRect.init(x: 0, y: 0, width: 80, height: 80))
    heardImageV.center = CGPoint.init(x: self.view.center.x, y: 160)
    heardImageV.layer.masksToBounds = true
    heardImageV.image = UIImage.init(named: "HeaderImageV")
    heardImageV.layer.borderWidth = 6
    heardImageV.layer.backgroundColor = UIColor.cyan.cgColor
    heardImageV.layer.cornerRadius = heardImageV.bounds.width * 0.5
    heardImageV.contentMode = .scaleAspectFill
    bGImageView.addSubview(heardImageV)
    
    /**
     账号
     */
    let AccountLable = UILabel.init(frame: CGRect.init(x: 40, y:heardImageV.frame.maxY+30
, width: 40, height: 30))
    AccountLable.text = "账户:"
    bGImageView.addSubview(AccountLable)
    
    AccountTextField = UITextField.init(frame: CGRect.init(x: AccountLable.frame.maxX+10, y: heardImageV.frame.maxY + 32, width: bGImageView.frame.width - 90 - AccountLable.frame.width, height: 30))
    AccountTextField?.placeholder = "请输入您的账户"
    bGImageView.addSubview(AccountTextField!)
    
    let line = UIView.init(frame: CGRect.init(x: 40, y: AccountLable.frame.maxY, width: bGImageView.frame.width - 80, height: 1))
    line.backgroundColor = UIColor.gray
    bGImageView.addSubview(line)
    
    /**
     密码
     */
    let passWLable = UILabel.init(frame: CGRect.init(x: 40, y: line.frame.maxY+40, width: 40, height: 30))
    passWLable.text = "密码:"
    bGImageView.addSubview(passWLable)
    
    passWTextField = UITextField.init(frame: CGRect.init(x: passWLable.frame.maxX+10, y: line.frame.maxY + 42, width: bGImageView.frame.width - passWLable.frame.width - 90, height: 30))
    passWTextField?.placeholder = "请输入密码"
    bGImageView.addSubview(passWTextField!)
    
    let lineV = UIView .init(frame: CGRect.init(x: 40, y: passWLable.frame.maxY, width: bGImageView.frame.width - 80, height: 1))
    lineV.backgroundColor = UIColor.gray
    bGImageView.addSubview(lineV)

    /**
     点击按钮
     */
    let loginBtn = UIButton.init(frame: CGRect.init(x: 40, y: lineV.frame.maxY + 50, width: bGImageView.frame.width - 80, height: 40))
    loginBtn.setTitle("登录", for: .normal)
    loginBtn.setTitleColor(UIColor.black, for: .normal)
    loginBtn.layer.cornerRadius = 6
    loginBtn.addTarget(self, action:#selector(click(_:)), for:.touchUpInside)
    loginBtn.layer.borderColor = UIColor.gray.cgColor
    loginBtn.layer.borderWidth = 1
    bGImageView.addSubview(loginBtn)
}


// TODO : 登录事件的触发
func click(_ btn:UIButton) -> Void {
    if (AccountTextField != nil) && (AccountTextField?.text?.characters.count != 0) {
        if self.passWTextField != nil && passWTextField?.text?.characters.count != 0 {
            self.loadData()
        }else{
            self.autoAlertView(message: "请填写密码")
        }
    }else{
        self.autoAlertView(message: "请填写账户")
    }
}

// TODO : 简短提示
func autoAlertView(message:String) -> Void {
    let autoAlert = UIAlertController.init(title: "", message: message, preferredStyle: .alert)
    self.present(autoAlert, animated: true) { 
        self.timer = Timer.init(timeInterval: 10, repeats: false, block: { (time) in
            autoAlert.dismiss(animated: true, completion:{
               self.timer?.invalidate()
            })
        })
        self.timer?.fire()
    }
}

// TODO : 活动指示器的提示
func activityIndicator(isFinsh:Bool) -> Void {
    if isFinsh {
        underView?.removeFromSuperview()
        return;
    }
    underView = UIView.init(frame: self.view.frame)
    underView?.backgroundColor = UIColor.clear
    self.view.addSubview(underView!)
    
    let activitV = UIActivityIndicatorView.init(frame: CGRect.init(x: 0, y: 0, width: 80, height: 80))
    activitV.center = CGPoint.init(x: underView!.center.x, y: underView!.center.y)
    activitV.backgroundColor = UIColor.gray
    activitV.activityIndicatorViewStyle = .whiteLarge
    activitV.layer.cornerRadius = 6
    underView?.addSubview(activitV)
    activitV.startAnimating()
}


func loadData() -> Void {
    self.activityIndicator(isFinsh: false)
    let url = URL.init(string: "http://api.3g.ifeng.com/clientShortNews?type=beauty")
    let request = URLRequest.init(url: url!)
    let DataTask = URLSession.shared.dataTask(with: request) { (data, resp, error) in
        self.activityIndicator(isFinsh: true)
        if data != nil && error == nil {
            let dict = try! JSONSerialization.jsonObject(with: data!, options: .mutableContainers)
            DispatchQueue.main.async(execute: {
                 let  Vc = HomeViewController.init()
                 Vc.dataDictionary = (dict as! NSDictionary)
                 let NavVc = UINavigationController.init(rootViewController: Vc)
                 self.present(NavVc, animated: true, completion: nil)
            })
        }
    }
    DataTask.resume()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

7> 登录成功后的页面


import UIKit



class HomeViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
var dataDictionary:NSDictionary?
override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationItem.title = "首页"
    let RootTableView = UITableView.init(frame: self.view.frame, style: .plain)
    RootTableView.delegate = self
    RootTableView.dataSource = self
    self.view.addSubview(RootTableView)
    // Do any additional setup after loading the view.
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
     return 60
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     return (self.dataDictionary?["list"] as! NSArray).count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCell(withIdentifier: "cell_login")
    if cell == nil {
         cell = UITableViewCell.init(style: .value1, reuseIdentifier: "cell_login")
    }
    let  arrayList = self.dataDictionary?["list"] as! NSArray
    let dict = arrayList[indexPath.row] as! NSDictionary
    cell?.textLabel?.text = (dict["name"] as! String)
    cell?.detailTextLabel?.text = (dict["type"] as! String)
    return cell!
}
override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,991评论 25 709
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,260评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,787评论 4 61
  • 江海无穷去,红云绕岱生。 柴门收落日,临岸诵黄庭。
    云苍狗阅读 2,784评论 2 4
  • 今天早上依然5点半就醒了,突然想起前段时间徐老师发群里的高考倒计时天数。顿觉紧张袭人。我在想我要做点什么...
    幸运二月阅读 3,251评论 0 0

友情链接更多精彩内容