Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)
前面的几篇文章讲解了自动布局库SnapKit的使用方法。本文通过一个完整的样例(登录页面)来演示在实际项目中如何使用SnapKit来实现自动化布局的。
1,效果图如下
2.代码讲解
(1)用户名、密码输入区域(白色区域)设置垂直居中约束,其高度是固定90,宽度自适应(距离屏幕左右侧都为15像素)
(2)用户名、密码输入框之间分割线是使用灰色背景的UIView实现,其高度是1像素,同样设置垂直居中约束。
(3)登录按钮距离上方输入区域20像素,高度固定是40,宽度同样自适应(距离屏幕左右侧都为15像素)
(4)上方标题标签据下方输入区域20像素,宽度自适应,内容居中。
(5)当键盘出现时,修改输入区域的垂直约束偏移量,使其向上移动(移动时,登陆按钮、标题标签也会同步移动)。避免在使用小屏设备时,键盘把登录框给挡住。
(6)键盘消失时,整个登录区域又会下移回复原位(上移、下移过程都有动画效果)
3,页面代码
import UIKit
import SnapKit
class ViewController: UIViewController, UITextFieldDelegate {
var txtUser: UITextField! //用户名输入框
var txtPwd: UITextField! //密码输入款
var formView: UIView! //登陆框视图
var horizontalLine: UIView! //分隔线
var confirmButton:UIButton! //登录按钮
var titleLabel: UILabel! //标题标签
var topConstraint: Constraint? //登录框距顶部距离约束
override func viewDidLoad() {
super.viewDidLoad()
//视图背景色
self.view.backgroundColor = UIColor(red: 1/255, green: 170/255, blue: 235/255,
alpha: 1)
//登录框高度
let formViewHeight = 90
//登录框背景
self.formView = UIView()
self.formView.layer.borderWidth = 0.5
self.formView.layer.borderColor = UIColor.lightGrayColor().CGColor
self.formView.backgroundColor = UIColor.whiteColor()
self.formView.layer.cornerRadius = 5
self.view.addSubview(self.formView)
//最常规的设置模式
self.formView.snp_makeConstraints { (make) -> Void in
make.left.equalTo(15)
make.right.equalTo(-15)
//存储top属性
self.topConstraint = make.centerY.equalTo(self.view).constraint
make.height.equalTo(formViewHeight)
}
//分隔线
self.horizontalLine = UIView()
self.horizontalLine.backgroundColor = UIColor.lightGrayColor()
self.formView.addSubview(self.horizontalLine)
self.horizontalLine.snp_makeConstraints { (make) -> Void in
make.height.equalTo(0.5)
make.left.equalTo(15)
make.right.equalTo(-15)
make.centerY.equalTo(self.formView)
}
//密码图
let imgLock1 = UIImageView(frame:CGRectMake(11, 11, 22, 22))
imgLock1.image = UIImage(named:"iconfont-user")
//密码图
let imgLock2 = UIImageView(frame:CGRectMake(11, 11, 22, 22))
imgLock2.image = UIImage(named:"iconfont-password")
//用户名输入框
self.txtUser = UITextField()
self.txtUser.delegate = self
self.txtUser.placeholder = "用户名"
self.txtUser.tag = 100
self.txtUser.leftView = UIView(frame:CGRectMake(0, 0, 44, 44))
self.txtUser.leftViewMode = UITextFieldViewMode.Always
self.txtUser.returnKeyType = UIReturnKeyType.Next
//用户名输入框左侧图标
self.txtUser.leftView!.addSubview(imgLock1)
self.formView.addSubview(self.txtUser)
//布局
self.txtUser.snp_makeConstraints { (make) -> Void in
make.left.equalTo(15)
make.right.equalTo(-15)
make.height.equalTo(44)
make.centerY.equalTo(0).offset(-formViewHeight/4)
}
//密码输入框
self.txtPwd = UITextField()
self.txtPwd.delegate = self
self.txtPwd.placeholder = "密码"
self.txtPwd.tag = 101
self.txtPwd.leftView = UIView(frame:CGRectMake(0, 0, 44, 44))
self.txtPwd.leftViewMode = UITextFieldViewMode.Always
self.txtPwd.returnKeyType = UIReturnKeyType.Next
//密码输入框左侧图标
self.txtPwd.leftView!.addSubview(imgLock2)
self.formView.addSubview(self.txtPwd)
//布局
self.txtPwd.snp_makeConstraints { (make) -> Void in
make.left.equalTo(15)
make.right.equalTo(-15)
make.height.equalTo(44)
make.centerY.equalTo(0).offset(formViewHeight/4)
}
//登录按钮
self.confirmButton = UIButton()
self.confirmButton.setTitle("登录", forState: UIControlState.Normal)
self.confirmButton.setTitleColor(UIColor.blackColor(),
forState: UIControlState.Normal)
self.confirmButton.layer.cornerRadius = 5
self.confirmButton.backgroundColor = UIColor(colorLiteralRed: 1, green: 1, blue: 1,
alpha: 0.5)
self.confirmButton.addTarget(self, action: #selector(loginConfrim),
forControlEvents: .TouchUpInside)
self.view.addSubview(self.confirmButton)
self.confirmButton.snp_makeConstraints { (make) -> Void in
make.left.equalTo(15)
make.top.equalTo(self.formView.snp_bottom).offset(20)
make.right.equalTo(-15)
make.height.equalTo(44)
}
//标题label
self.titleLabel = UILabel()
self.titleLabel.text = "hangge.com"
self.titleLabel.textColor = UIColor.whiteColor()
self.titleLabel.font = UIFont.systemFontOfSize(36)
self.view.addSubview(self.titleLabel)
self.titleLabel.snp_makeConstraints { (make) -> Void in
make.bottom.equalTo(self.formView.snp_top).offset(-20)
make.centerX.equalTo(0)
make.height.equalTo(44)
}
}
//输入框获取焦点开始编辑
func textFieldDidBeginEditing(textField:UITextField)
{
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.topConstraint?.updateOffset(-125)
self.view.layoutIfNeeded()
})
}
//输入框返回时操作
func textFieldShouldReturn(textField:UITextField) -> Bool
{
let tag = textField.tag
switch tag {
case 100:
self.txtPwd.becomeFirstResponder()
case 101:
loginConfrim()
default:
print(textField.text)
}
return true
}
//登录按钮点击
func loginConfrim(){
//收起键盘
self.view.endEditing(true)
//视图约束恢复初始设置
UIView.animateWithDuration(0.5, animations: { () -> Void in
self.topConstraint?.updateOffset(0)
self.view.layoutIfNeeded()
})
}
}
Swift - 自动布局库SnapKit的使用详解4(样例1:实现一个登录页面)的更多相关文章
- Swift - 自动布局库SnapKit的使用详解2(约束的更新、移除、重做)
在之前的文章中我介绍了如何使用SnapKit的 snp_makeConstraints 方法进行各种约束的设置.但有时我们的页面并不是一直固定不变的,这就需要修改已经存在的约束.本文介绍如何更新.移除 ...
- Swift - 自动布局库SnapKit的使用详解1(配置、使用方法、样例)
为了适应各种屏幕尺寸,iOS 6后引入了自动布局(Auto Layout)的概念,通过使用各种 Constraint(约束)来实现页面自适应弹性布局. 在 StoryBoard 中使用约束实现自动布局 ...
- Swift - 自动布局库SnapKit的使用详解3(约束优先级,约束做动画)
1,约束优先级我们使用SnapKit的时候,还可以定义约束的优先级.这样当约束出现冲突的时候,优先级高的约束覆盖优先级低的约束.具体优先级可以放在约束链的结束处. (1)可以设置如下几种优先级 pri ...
- 技巧:Linux 动态库与静态库制作及使用详解
技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...
- (转)python标准库中socket模块详解
python标准库中socket模块详解 socket模块简介 原文:http://www.lybbn.cn/data/datas.php?yw=71 网络上的两个程序通过一个双向的通信连接实现数据的 ...
- Python中第三方库Requests库的高级用法详解
Python中第三方库Requests库的高级用法详解 虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好.它已经不适合现在的时代, ...
- iOS开发——网络编程Swift篇&(八)SwiftyJSON详解
SwiftyJSON详解 最近看了一些网络请求的例子,发现Swift在解析JSON数据时特别别扭,总是要写一大堆的downcast(as?)和可选(Optional),看?号都看花了.随后发现了这个库 ...
- python requests库与json数据处理详解
1. http://docs.python-requests.org/zh_CN/latest/user/quickstart.html get方法将参数放在url里面,安全性不高,但是效率高:pos ...
- iOS开发——网络编程Swift篇&(七)NSURLSession详解
NSURLSession详解 // MARK: - /* 使用NSURLSessionDataTask加载数据 */ func sessionLoadData() { //创建NSURL对象 var ...
随机推荐
- javascript学习-原生javascript的小特效(原生javascript实现链式运动)
以下代码就不详细解析了,在我之前的多个运动效果中已经解析好多次了,重复的地方这里就不说明了,有兴趣的童鞋可以去看看之前的文章<原生javascript的小特效> <!DOCTYPE ...
- eclipse查看jdk源码,及反编译查看
jdk中的包: dt.jar是关于运行环境的类库,主要是swing的包 tools.jar是关于一些工具的类库 rt.jar包含了jdk的基础类库,也就是你在java doc里面看到的所有的类的cla ...
- Android图形显示之硬件抽象层Gralloc(hal 转)
原文 http://blog.csdn.net/yangwen123/article/details/12192401 FrameBuffer驱动程序分析 文中介绍了Linux系统下的显示驱动框架, ...
- (转)http接口测试——Jmeter接口测试实例讲解
http://my.oschina.net/hellotest/blog/512482
- Android 可拖动列表项的ListView
需求分析 一个界面内两个ListView 我关注的栏目列表 上面的要长按后可拖动排序 点击减号后列表项消失 下面列表增加一行 同时存储相应字符串到本地作为标记 未关注栏目列表 普通ListView 点 ...
- 【服务器环境搭建-Centos】Nginx1.9.9 配置启用 --待续
1.worker_processes worker_processes 4;## 4核,所以设置4个 worker_cpu_affinity 0001 0010 0100 1000; nginx在启动 ...
- Linux下利用rsync实现多服务器文件同步
windows做为文件服务器,使用rsync的windows服务版本,然后配置好就可以了.需要的朋友可以参考下. windows做为文件服务器,使用rsync的windows服务版本:cwRsyncS ...
- Ubuntu 查看文件以及磁盘空间大小管理
(1)查看文件大小 查看当前文件夹下所有文件大小(包括子文件夹) du -sh # du -h15M ./package16K ./.fontconfig4.0K . ...
- 转!!!Mybatis实现数据的增删改查(CRUD)
什么是 MyBatis? MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架. MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及对结果集的检索.MyBat ...
- 如何使用 declare-styleable
如何使用 declare-styleable 在创建 xml 到 objectName/res/values/ 命名为 attrs.xml 编辑文件内容为(示例)<?xml version=&q ...