为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。但是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.zip"很可能是关于如何在Swift5.2中使用`NSLayoutConstraint`来创建和管理用户界面元素的示例代码或教程。 `NSLayoutConstraint`是苹果自动布局系统的基础,...
然而,AutoLayout的原生API使用NSLayoutConstraint进行设置,这通常会导致代码变得复杂且难以阅读。为了解决这个问题,`swift-简单的NSLayoutConstraint表达式解析器` 提供了一种更简洁、易读的方式来编写AutoLayout...
本篇文档主要介绍了在iOS开发中,使用NSLayoutConstraint(自动布局约束)和VFL(视觉格式语言)进行布局的方法和技巧。 首先,NSLayoutConstraint是UIKit框架中用于布局的类,它允许开发者在iOS应用中创建复杂的...
然而,传统的NSLayoutConstraint使用方式可能会导致代码变得冗长且难以维护。为了简化这一过程,开发者们常常采用更高效的方法来管理布局,如“Eelay”可能就是一种这样的解决方案。 "iOS 极大简化 ...
在iOS和macOS开发中,`NSPresentationOptions`和`NSLayoutConstraint`是两个非常重要的概念,特别是在用户界面的展示和布局方面。`NSPresentationOptions`主要用于控制视图控制器的呈现方式,而`NSLayoutConstraint`...
紧凑约束一个简单的NSLayoutConstraint表达式解析器,用于更具可读性的自动布局代码。 由,并根据MIT许可发布(请参阅LICENSE文件)。 Apple的很有帮助,但它不能表示所有类型的自动布局约束,对于简单的值也不理想...
NSLayoutConstraint-CombinedVFL NSLayoutConstraint 的类别允许同时调用水平和垂直用法: [ NSLayoutConstraint constraintsWithCombinedVisualFormat: @" H:|[myView]| V:|[myView]| " views: @{ @" myView " : ...
TinyLayout µframework旨在成为在Swift中声明或应用AutoLayout NSLayoutConstraint的最简短和易读的方法。TinyLayout可以为您做什么? 使用TinyLayout,您可以停止执行此操作: let superview = self . viewlet ...
在iOS开发中,WKWebView...NSLayoutConstraint *webViewLeading = [NSLayoutConstraint constraintWithItem:webView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:...
通过开启`NSLayoutConstraint.activate()`中的`NSLayoutConstraint.debugDescription`,可以在控制台看到约束的详细信息,帮助定位问题。 Size Classes是另一个关键概念,它提供了一种在不同屏幕尺寸和设备类型上...
NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop ...
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[bgImage]-0-|" options:0 metrics:0 views:viewsbg]]; // [self.view addConstraints:[NSLayoutConstraint ...
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: constraintsFormat, options: [], metrics: nil, views: viewsDictionary)) ``` 在这个例子中,`H:`表示水平方向,`|-16-[label]-...
例如,我们可以定义`addConstraintWithVisualFormat:`方法,它接受一个与AutoLayout的视觉格式字符串,并将其转化为`NSLayoutConstraint`对象,然后将这些约束应用到其对应的视图上。这样做可以让我们的`CALayer`看...
NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:floatingButton attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:...
在Swift中,使用`NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: options: metrics: views:))`。在这个方法中,需要传入VFL字符串、选项、间距/尺寸字典以及视图字典。 **4. VFL...
本篇文章将深入探讨AutoLayout的三种主要实现方式:XIB(Interface Builder)、代码编程以及AutoLayout的NSLayoutConstraint语法。 **1. XIB(Interface Builder)实现** XIB是Apple的图形用户界面设计工具,它...
SnapKit是为了解决AutoLayout使用NSLayoutConstraint直接编码时,代码的繁琐和不易维护的问题而生的。它提供了一种更加符合Swift语言特性的布局表达方式。使用SnapKit,开发者可以用更直观、更简洁的Swift代码来定义...
2. **创建约束**:使用`NSLayoutConstraint.constraintsWithVisualFormat(_:options:metrics:views:)`方法,传入VFL字符串,选项,度量值和视图字典来创建约束。 3. **优点**:VFL减少了代码量,提高了可读性,特别...
综上所述,Swift 4的AutoLayout提供了多种方式来简化界面布局的实现,包括使用`NSLayoutAnchor`、`NSLayoutConstraint.constraints(withVisualFormat:)`、`UILayoutGuide`以及`UIStackView`。熟练掌握这些技术,你就...