IOS使用Auto Layout中的VFL适配
做登录页面,之前做都是用frame做,今天想着用Auto Layout中的VFL来做。觉得做的效果还是可以的(自恋一下下)。
首先看下效果图和标记图
自己在做的过程中也遇到了好多问题,不过也一个一个的自己解决了
1.子视图居中的问题
上一博客我也写了,由于指定了视图的宽度高度,想让视图居中对齐,可它就是不能达到预期,最后还是网上找了下才解决的。
2.约束不起作用
引起这个问题的原因很多,其中有一个是犯的最愚蠢的错误,就是添加约束前设置子视图
setTranslatesAutoresizingMaskIntoConstraintsNO.
setTranslatesAutoresizingMaskIntoConstraints=NO.
setTranslatesAutoresizingMaskIntoConstraints=NO
重要的事情说三遍
-------------------华丽的分割线------------------------------------
上面说的适配,这里说下实现
根据上图有一个账号 一个密码,它们两个只是图片 名称和文本类型不一样其他都一样,所以我就把它封装成一个View。
// // LoginView.h // Login // // Created by City--Online on 15/9/8. // Copyright (c) 2015年 City--Online. All rights reserved. // #import <UIKit/UIKit.h> @interface LoginView : UIView @property (nonatomic,strong) UIImageView *leftImgView; @property (nonatomic,strong) UILabel *nameLabel; @property (nonatomic,strong) UITextField *txtField; @property (nonatomic,strong) UIView *bottomLine; @end
// // LoginView.m // Login // // Created by City--Online on 15/9/8. // Copyright (c) 2015年 City--Online. All rights reserved. // #import "LoginView.h" @implementation LoginView -(instancetype)init { self=[super init]; if (self) { [self setTranslatesAutoresizingMaskIntoConstraints:NO]; //左边图片 _leftImgView=[[UIImageView alloc]init]; [_leftImgView setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:_leftImgView]; //名称 _nameLabel=[[UILabel alloc]init]; _nameLabel.font=[UIFont systemFontOfSize:18.0]; _nameLabel.textColor=[UIColor colorWithRed:0.200f green:0.200f blue:0.200f alpha:1.00f]; [_nameLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:_nameLabel]; //输入文本框 _txtField=[[UITextField alloc]init]; _txtField.font=[UIFont systemFontOfSize:]; // _txtField.layer.borderWidth=2.0; [_txtField setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:_txtField]; //底部线条 _bottomLine=[[UIView alloc]init]; _bottomLine.backgroundColor=[UIColor colorWithRed:0.427f green:0.427f blue:0.427f alpha:1.00f]; [_bottomLine setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addSubview:_bottomLine]; } return self; } -(void)updateConstraints { [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(_leftImgView,_nameLabel,_txtField)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(_leftImgView,_bottomLine)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(_bottomLine)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(_txtField,_bottomLine)]]; [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(_nameLabel)]]; [super updateConstraints]; } @end
在界面中布局登录页面:
// // ViewController.m // Login // // Created by City--Online on 15/9/8. // Copyright (c) 2015年 City--Online. All rights reserved. // #import "ViewController.h" #import "LoginView.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor=[UIColor whiteColor]; //顶部图片 UIImageView *headView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"MR WU.png"]]; [headView setTranslatesAutoresizingMaskIntoConstraints:NO]; [self.view addSubview:headView]; NSDictionary* views = NSDictionaryOfVariableBindings(headView); //设置高度 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:views]]; //设置宽度 [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:views]]; //水平居中 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:headView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier: constant:]]; //账号 LoginView *accountView=[[LoginView alloc]init]; accountView.leftImgView.image=[UIImage imageNamed:@"user.png"]; accountView.nameLabel.text=@"账号"; accountView.txtField.secureTextEntry=NO; [self.view addSubview:accountView]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(accountView)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(headView,accountView)]]; //密码 LoginView *passWordView=[[LoginView alloc]init]; passWordView.leftImgView.image=[UIImage imageNamed:@"lock-"]; passWordView.nameLabel.text=@"密码"; passWordView.txtField.secureTextEntry=YES; [self.view addSubview:passWordView]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(passWordView)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(accountView,passWordView)]]; //登录按钮 UIButton *loginBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect]; [loginBtn setTranslatesAutoresizingMaskIntoConstraints:NO]; [loginBtn setTitle:@"登录" forState:UIControlStateNormal]; [loginBtn setTitleColor:[UIColor colorWithRed:1.000f green:1.000f blue:1.000f alpha:1.00f] forState:UIControlStateNormal]; loginBtn.titleLabel.font=[UIFont systemFontOfSize:]; loginBtn.backgroundColor=[UIColor colorWithRed:0.992f green:0.318f blue:0.106f alpha:1.00f]; [self.view addSubview:loginBtn]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(passWordView,loginBtn)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(loginBtn)]]; UILabel *titleLabel=[[UILabel alloc]init]; [titleLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; titleLabel.text=@"胖吴货栈发货系统"; titleLabel.font=[UIFont systemFontOfSize:14.0]; [titleLabel setTextColor:[UIColor colorWithRed:0.992f green:0.318f blue:0.106f alpha:1.00f]]; [self.view addSubview:titleLabel]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"[titleLabel]" options:NSLayoutFormatAlignAllCenterX metrics:nil views:NSDictionaryOfVariableBindings(titleLabel)]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat: metrics:nil views:NSDictionaryOfVariableBindings(titleLabel)]]; [self.view addConstraint:[NSLayoutConstraint constraintWithItem:titleLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier: constant:]]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } @end
上面代码中包含了VFL的基本语法,对于更深的语法慢慢的来了解,晒一下做的效果
4s
5
5s
6
6+
前面用的autoLayout自动布局,想着是自动布局Frame会不起作用,一直纠结键盘遮挡的问题。在网上找了下,有网友说改变约束,自己的布局也正好是以顶部的图片依次相对布局 ,所以准备改下顶部的约束就会解决键盘遮挡。自己定了一个标记值,判断键盘隐藏顶部约束值为正,否则为负。可是问题出现了,点击文本框后能键盘弹出后视图能向上,但键盘隐藏之后视图并未回到原位,自己又试着删除全部约束重新添加可还是不行,这个问题让我纠结好久。最后问了下小伙伴oliver,改了下frame问题就解决了。我以为用autolayout并未设置frame,怎么会有呢,问了他下,原来适配也是有frame的。这让我想起了autoLayout的原理,它属于数学的线性规划。最终还是会有一个值的
IOS使用Auto Layout中的VFL适配的更多相关文章
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
使用Auto Layout中的VFL(Visual format language)--代码实现自动布局 2014-12-09 10:56 编辑: zhiwupei 分类:iOS开发 来源:机智的新手 ...
- 使用Auto Layout中的VFL(Visual format language)--代码实现自动布局【转】
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- 转载自@机智的新手:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- 【转】使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- 转载:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...
- 使用Auto Layout中的VFL(Visual format language)——代码实现自动布局
本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:api介绍 1.NSLayoutConstraint API NSL ...
- [Android开发学iOS系列] Auto Layout
[Android开发学iOS系列] Auto Layout 内容: 介绍什么是Auto Layout. 基本使用方法 在代码中写约束的方法 Auto Layout的原理 尺寸和优先级 Auto Lay ...
- iOS Programming Auto Layout: Programmatic Constraints 自动布局:通过编程限制
iOS Programming Auto Layout: Programmatic Constraints 1. However, if your views are created in co ...
- iOS 7 - Auto Layout on iOS Versions prior to 6.0
链接地址:http://stackoverflow.com/questions/18735847/ios-7-auto-layout-on-ios-versions-prior-to-6-0 Stac ...
随机推荐
- .NET处理HTTP请求
第一种:使用HttpWebRequest string result = ""; HttpWebRequest request = (HttpWebRequest)WebReque ...
- Sql语法高级应用之二:视图
SQL CREATE VIEW 语句 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列,就像一个真实的表.视图中的字段就是来自一个或多个数据库中的真实的表中 ...
- html开发基础
1 Doctype Doctype告诉浏览器使用什么样的html或xhtml规范来解析html文档 有和无的区别 BackCompat:标准兼容模式未开启(或叫怪异模式[Quirks mode].混杂 ...
- yield 学习
什么是生成器 生成器是可以迭代的,但是你只可以读取它一次 ,因为它并不把所有的值放在内存中,它是实时地生成数据. yield 理解 通常的for...in...循环中,in后面是一个数组,这个数组就是 ...
- Prufer codes与Generalized Cayley's Formula学习笔记
\(Prufer\)序列 在一棵\(n\)个点带标号无根树里,我们定义这棵树的\(Prufer\)序列为执行以下操作后得到的序列 1.若当前树中只剩下两个节点,退出,否则执行\(2\) 2.令\(u\ ...
- NOI2019省选模拟赛 第六场
传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...
- AngularJS源码解析2:注入器的详解
上一课,没有讲createInjector方法,只是讲了它的主要作用,这一课,详细来讲一下这个方法.此方法,最终返回的注册器实例对象有以下几个方法: invoke, instantiate, get, ...
- Java中类变量和实例变量的初始化
1. 类变量和实例变量 类变量即类成员变量中的静态变量,它们可以通过类名来直接访问. 实例变量是类成员变量中的非静态变量,只有在实例化对象之后通过对象来访问. 2. 空间分配的时间不同 类变量是在类加 ...
- Myeclipse设置自动联想功能
///声明,博客园暂无转载功能,这篇博客是转载自贞心真义. 最近初学Java,正在使用MyEclipse来编写新的项目,刚开始打开MyEclipse感觉这个工具既陌生又熟悉,熟悉之处在于编辑器的几大共 ...
- python 爬虫 黑科技
1.最基本的抓站 import urllib2 content = urllib2.urlopen('http://XXXX').read() 2.使用代理服务器 这在某些情况下比较有用,比如IP被封 ...