ios NSLayoutConstraint
为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。但是iphone5和以前的屏幕不一样了,在以前的设备中,我们可以添加一个 xx.@2x.png来适应retina屏幕,但是iphoen5咋办呢?ios6引入了 Auto Layout的东东,这个要和UIViewAutoresizing区分下。
1.看下面代码:
-(void)viewDidLoad
{
[superviewDidLoad];
UIView *aView =[[UIView alloc] init];
aView.backgroundColor = [UIColor redColor];
//为了不和autosizing冲突,我们设置No
[aView setTranslatesAutoresizingMaskIntoConstraints:NO];//不把AutoresizingMask转化为Constraints
[self.view addSubview:aView];
UIView *bView =[[UIView alloc] init];
bView.backgroundColor = [UIColor blueColor];
[bView setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:bView];
NSDictionary*views =NSDictionaryOfVariableBindings(aView, bView);
/* This macro is a helper for making view dictionariesfor +constraintsWithVisualFormat:options:metrics:views:.
NSDictionaryOfVariableBindings(v1, v2, v3) isequivalent(等效于) to [NSDictionarydictionaryWithObjectsAndKeys:v1, @"v1", v2, @"v2", v3,@"v3", nil];
*/
[self.viewaddConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-(>=50)-[aView(100)]"
options:0
metrics:nil
views:views]];
[self.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=100)-[aView(50)]"
options:0
metrics:nil
views:views]];
[self.viewaddConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"H:[bView(==aView)]"
options:0
metrics:nil
views:views]];
[self.view addConstraints:
[NSLayoutConstraint constraintsWithVisualFormat:@"V:[bView(==aView)]"
options:0
metrics:nil
views:views]];
[self.viewaddConstraint:
[NSLayoutConstraint constraintWithItem:bView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:aView
attribute:NSLayoutAttributeRight
multiplier:1
constant:10]];
//添加一个限制等效于bView.frame.origin.x = (aView.frame.origin.x +aView.frame.size.width) * 1 + 10!它是一种依赖关系,bView依赖aView,这样就算aView变了,bView也会跟着变换。
[self.viewaddConstraint:
[NSLayoutConstraint constraintWithItem:bView
attribute:NSLayoutAttributeTop
relatedBy:NSLayoutRelationEqual
toItem:aView
attribute:NSLayoutAttributeTop
multiplier:1
constant:0]];
[aView release];
[bView release];
}
2.constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant:
/* Create constraints explicitly. Constraints are of the form "view1.attr1 = view2.attr2 * multiplier
+ constant"
If your equation does not have a second view and attribute, use nil and NSLayoutAttributeNotAnAttribute.
*/
3.属性
typedefNS_ENUM(NSInteger, NSLayoutAttribute) {
NSLayoutAttributeLeft = 1,
NSLayoutAttributeRight,
NSLayoutAttributeTop,
NSLayoutAttributeBottom,
NSLayoutAttributeLeading,
NSLayoutAttributeTrailing,
NSLayoutAttributeWidth,
NSLayoutAttributeHeight,
NSLayoutAttributeCenterX,
NSLayoutAttributeCenterY,
NSLayoutAttributeBaseline,
NSLayoutAttributeNotAnAttribute = 0
};
4.关系
typedefNS_ENUM(NSInteger, NSLayoutRelation) {
NSLayoutRelationLessThanOrEqual = -1,
NSLayoutRelationEqual = 0,
NSLayoutRelationGreaterThanOrEqual = 1,
};
最后的结果就是 “view1.attr1 <= 或者 == 或者 >= view2.attr2 * multiplier + constant”
5.Visual Format Language (视觉形式语言)
ios NSLayoutConstraint的更多相关文章
- IOS NSLayoutConstraint 页面布局(通过代码添加约束)
#import "ViewController.h" @interface ViewController () @property (nonatomic, strong) UIVi ...
- ios Autolayout 按比例相对布局
看到一篇讲ios storyboard 按比例相对布局的博客,挺不错的转下来了! 可到liumh.com查看. 本文记录如何在 UIStoryboard 或者 xib 中进行百分比布局,包括 View ...
- Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 (主要是NSLayoutConstraint 的使用)
当前位置: > Swift新手入门 > Swift技术之如何在iOS 8下使用Swift设计一个自定义的输入法 时间:2014-09-10 16:49来源:未知 作者:啊成 举报 点击:5 ...
- iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry)
iOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫 ...
- 关于iOS 5 Could not instantiate class named NSLayoutConstraint错误
因为使用Xcode 4.6.2,新建工程的时候SDK 6.1,但是要做低版本适配.在将iOS模拟器选为5.0编译运行时候出现Could not instantiate class named NSLa ...
- iOS 5解决Could not instantiate class named NSLayoutConstraint问题
如果使用Xcode 4.5来新建项目,默认是支持AutoLayout的,但是AutoLayout是iOS 6的新特性,如果在iOS 5的simulator上运行程序,会出现Could not inst ...
- IOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 转载
http://blog.csdn.net/he_jiabin/article/details/48677911 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为 ...
- iOS开发NSLayoutConstraint代码自动布局
1.NSLayoutConstraint简介 适配界面大多用Masonry工具,也是基于NSLayoutConstraint写的!通过使用两个类方法实现自动布局: + (NSArray<__ki ...
- 【iOS】屏幕适配之NSLayoutConstraint
前言 如何实现一张图片在iPhone和iPad上显示不同的尺寸,我了解到一般有三种办法:直接手写代码动态添加约束:把NSLayoutConstraint关联到ViewController里再viewD ...
随机推荐
- protect和private 的区别
protect和private 的区别 public 表示全局,类内部外部子类都可以访问: private表示私有的,只有本类内部可以使用: protected表示受保护的,只有本类或子类或父类中可以 ...
- mybatis 添加事物后 无法获取自增主键的问题
检查代码后没发现mapper文件设置自增主键返回的问题,后来检查到,关闭事务后,执行完是可以获取返回的主键的, 我在mysql的客户端里关闭自动提交,发现使用select last_insert_id ...
- 【C语言入门教程】4.6 指针 和 数组
数组在内存中以顺序的形式存放,数组的第一个存储单元的地址即数组的首地址.对一维数组来说,直接引用数组名就能获得该数组的首地址.指针变量可以存放于其内容相同的数组首地址,也可以指向某一具体的数组元素.通 ...
- tcp三次握手与四次挥手
- python下载网页源码 写入文本
import urllib.request,io,os,sysreq=urllib.request.Request("http://echophp.sinaapp.com/uncategor ...
- 分享一个c#t的网页抓取类
using System; using System.Collections.Generic; using System.Web; using System.Text; using System.Ne ...
- java中二进制和流的相互转换
流转二进制 public static byte[] toByteArray(InputStream in) throws IOException { ByteArrayOutputStream ou ...
- 关于promise(一)
该新特性属于 ECMAScript 2015(ES6)规范,在使用时请注意浏览器兼容性. 由于ES6原生提供Promise,所以无需安装Promise库.但在ES5环境下我们可以使用bluebird库 ...
- 从输入 URL 到浏览器接收的过程中发生了什么事情?
从输入 URL 到浏览器接收的过程中发生了什么事情? What really happens when you navigate to a URL 上面两篇文章都解读的很好,值得阅读. 接下来在总结一 ...
- Html中各种空格的显示
一.使用全角空格 全角空格被解释为汉字,所以不会被被解释为HTML分隔符,可以按照实际的空格数显示. 二.使用空格的替代符号 替代符号就是在需要显示空格的地方加入替代符号,这些符号会被浏览器解释为空格 ...