为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。但是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 (视觉形式语言)
为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。但是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 (视觉形式语言)
http://blog.csdn.net/oqqquzi1234567/article/details/9002505
分享到:
相关推荐
Swift5.2 (系统约束)NSLayoutConstraint
简单的NSLayoutConstraint表达式解析器,用于更易读的autolayout代码
ios入门
将控件及布局信息放在一个Array里面,简单的代码包含大量的布局信息
紧凑约束一个简单的NSLayoutConstraint表达式解析器,用于更具可读性的自动布局代码。 由,并根据MIT许可发布(请参阅LICENSE文件)。 Apple的很有帮助,但它不能表示所有类型的自动布局约束,对于简单的值也不理想...
NSLayoutConstraint-CombinedVFL NSLayoutConstraint 的类别允许同时调用水平和垂直用法: [ NSLayoutConstraint constraintsWithCombinedVisualFormat: @" H:|[myView]| V:|[myView]| " views: @{ @" myView " : ...
NSPresentationOptionsTest 如何使用 NSPresentationOptions 和 NSLayoutConstraint 的示例 更多信息可以在上找到
TinyLayout µframework旨在成为在Swift中声明或应用AutoLayout NSLayoutConstraint的最简短和易读的方法。TinyLayout可以为您做什么? 使用TinyLayout,您可以停止执行此操作: let superview = self . viewlet ...
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[bgImage]-0-|" options:0 metrics:0 views:viewsbg]]; // [self.view addConstraints:[NSLayoutConstraint ...
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:constraintString options:0 metrics:0 views:views]]; } NSDictionary *views = NSDictionaryOfVariableBindings(self.view, btnBack, ...
Creating constraints with NSLayoutConstraint, Visual Format Language and Layout Anchors Which should you use? (Take a guess...) Safe area layout guides - embrace the notch! Layout margins everywhere ...
UIView+约束 例子 定心 UIView *v1 = [[UIView alloc ] initWithFrame: CGRectZero ]; v1.backgroundColor = [UIColor blueColor ]; [ self .view addSubview: v1]; [v1 addConstraintWidth: 100.0 height: ...
TinyConstraints是使Auto Layout更适合人类使用的语法糖。产品特点 纯粹的Swift 5甜度。 您可以使用“自动版式”进行所有操作,但是要简短一些...例子边缘使用NSLayoutConstraint将视图附加到其NSLayoutConstraint视图
自定义NSLayoutConstraint约束库
Restraint Restraint是一个非常小的库,可帮助您在Swift中使用NSLayoutConstraint更加清晰明了。 喜欢程序化视图吗? 喜欢使用纯AutoLayout的好处吗? 就像clear和min一样Restraint Restraint是一个非常小的库,可以...
Masonry提供更加完善、友好的API来代替直接使用NSLayoutConstraint进行编程,能够使视图布局的过程更加轻松。 说明: 需要让某个子视图位于某个父视图的中间,并且子视图上下左右四边离父视图的间距为10px。直接...
Masonry提供更加完善、友好的API来代替直接使用NSLayoutConstraint进行编程,能够使视图布局的过程更加轻松。 例如,需要让某个子视图位于某个父视图的中间,并且子视图上下左右四边离父视图的间距为10px。直接利用...
SwiftyLayout SwiftyLayout是一个框架,允许在Swift程序中将布局约束(即NSLayoutConstraint)描述为简单的数学公式。 关于Swift 2的版本SwiftyLayout 3 Swi SwiftyLayout SwiftyLayout是一个框架,可以将布局约束...
PureLayout通过全面的Auto Layout API扩展了UIView / NSView,NSArray和NSLayoutConstraint,该API模仿了Apple的iOS和OS X Auto Layout的终极API —极其简单,功能强大。 PureLayout使用全面的自动布局API扩展了...
iOS自动布局AutoLayout的系统学习,包括NSLayoutConstraint,VFL,Masonry,SnapKit等学习