`

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  (视觉形式语言)

   为了让我们的应用在不同尺寸的屏幕下都能 “正常”的表示,我们尽量不要把数据写死。大多数可视元素都是一个矩形区域,当然这个矩形区域有坐标的,我们有了这个区域坐标就能确定可视元素的现实位置了。但是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.zip"很可能是关于如何在Swift5.2中使用`NSLayoutConstraint`来创建和管理用户界面元素的示例代码或教程。 `NSLayoutConstraint`是苹果自动布局系统的基础,...

    swift-简单的NSLayoutConstraint表达式解析器用于更易读的autolayout代码

    然而,AutoLayout的原生API使用NSLayoutConstraint进行设置,这通常会导致代码变得复杂且难以阅读。为了解决这个问题,`swift-简单的NSLayoutConstraint表达式解析器` 提供了一种更简洁、易读的方式来编写AutoLayout...

    UI基础(代码布局:NSLayoutConstraint、VFL).pdf

    本篇文档主要介绍了在iOS开发中,使用NSLayoutConstraint(自动布局约束)和VFL(视觉格式语言)进行布局的方法和技巧。 首先,NSLayoutConstraint是UIKit框架中用于布局的类,它允许开发者在iOS应用中创建复杂的...

    iOS 极大简化 NSLayoutConstraint 布局方式

    然而,传统的NSLayoutConstraint使用方式可能会导致代码变得冗长且难以维护。为了简化这一过程,开发者们常常采用更高效的方法来管理布局,如“Eelay”可能就是一种这样的解决方案。 "iOS 极大简化 ...

    NSPresentationOptionsTest:如何使用 NSPresentationOptions 和 NSLayoutConstraint 的示例

    在iOS和macOS开发中,`NSPresentationOptions`和`NSLayoutConstraint`是两个非常重要的概念,特别是在用户界面的展示和布局方面。`NSPresentationOptions`主要用于控制视图控制器的呈现方式,而`NSLayoutConstraint`...

    CompactConstraint:简单的NSLayoutConstraint表达式解析器,用于更具可读性的自动布局代码

    紧凑约束一个简单的NSLayoutConstraint表达式解析器,用于更具可读性的自动布局代码。 由,并根据MIT许可发布(请参阅LICENSE文件)。 Apple的很有帮助,但它不能表示所有类型的自动布局约束,对于简单的值也不理想...

    NSLayoutConstraint-CombinedVFL:NSLayoutConstraint 的类别允许同时调用水平和垂直视觉格式语言

    NSLayoutConstraint-CombinedVFL NSLayoutConstraint 的类别允许同时调用水平和垂直用法: [ NSLayoutConstraint constraintsWithCombinedVisualFormat: @" H:|[myView]| V:|[myView]| " views: @{ @" myView " : ...

    TinyLayout:一个µframework,旨在成为在Swift中声明或应用AutoLayout NSLayoutConstraint的最简单易懂的方式

    TinyLayout µframework旨在成为在Swift中声明或应用AutoLayout NSLayoutConstraint的最简短和易读的方法。TinyLayout可以为您做什么? 使用TinyLayout,您可以停止执行此操作: let superview = self . viewlet ...

    OC-WKWebView(Html修改字体颜色)

    在iOS开发中,WKWebView...NSLayoutConstraint *webViewLeading = [NSLayoutConstraint constraintWithItem:webView attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:self.view attribute:...

    ios开发纯代码实现autolayout和sizeclasses初探

    通过开启`NSLayoutConstraint.activate()`中的`NSLayoutConstraint.debugDescription`,可以在控制台看到约束的详细信息,帮助定位问题。 Size Classes是另一个关键概念,它提供了一种在不同屏幕尺寸和设备类型上...

    屏幕自动旋转和调节大小

    NSLayoutConstraint *topConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeTop ...

    IOS 代码 自动化布局

    [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-0-[bgImage]-0-|" options:0 metrics:0 views:viewsbg]]; // [self.view addConstraints:[NSLayoutConstraint ...

    ios 获取设备唯一标示符(使用VFL语法添加约束)

    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: constraintsFormat, options: [], metrics: nil, views: viewsDictionary)) ``` 在这个例子中,`H:`表示水平方向,`|-16-[label]-...

    ios-优雅的实现CALayer的"AutoLayout"的两种方案.zip

    例如,我们可以定义`addConstraintWithVisualFormat:`方法,它接受一个与AutoLayout的视觉格式字符串,并将其转化为`NSLayoutConstraint`对象,然后将这些约束应用到其对应的视图上。这样做可以让我们的`CALayer`看...

    FloatingButton.zip

    NSLayoutConstraint *xConstraint = [NSLayoutConstraint constraintWithItem:floatingButton attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:self.view attribute:...

    IOS VFL(可视化语言布局)

    在Swift中,使用`NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: options: metrics: views:))`。在这个方法中,需要传入VFL字符串、选项、间距/尺寸字典以及视图字典。 **4. VFL...

    autolayout三种实现

    本篇文章将深入探讨AutoLayout的三种主要实现方式:XIB(Interface Builder)、代码编程以及AutoLayout的NSLayoutConstraint语法。 **1. XIB(Interface Builder)实现** XIB是Apple的图形用户界面设计工具,它...

    UI基础(代码布局:SnapKit).pdf

    SnapKit是为了解决AutoLayout使用NSLayoutConstraint直接编码时,代码的繁琐和不易维护的问题而生的。它提供了一种更加符合Swift语言特性的布局表达方式。使用SnapKit,开发者可以用更直观、更简洁的Swift代码来定义...

    ios8 vfl以及AutoLayout

    2. **创建约束**:使用`NSLayoutConstraint.constraintsWithVisualFormat(_:options:metrics:views:)`方法,传入VFL字符串,选项,度量值和视图字典来创建约束。 3. **优点**:VFL减少了代码量,提高了可读性,特别...

    swift-(一行代码搞定无论多复杂的约束)AutoLayoutforiOSbyswift4

    综上所述,Swift 4的AutoLayout提供了多种方式来简化界面布局的实现,包括使用`NSLayoutAnchor`、`NSLayoutConstraint.constraints(withVisualFormat:)`、`UILayoutGuide`以及`UIStackView`。熟练掌握这些技术,你就...

Global site tag (gtag.js) - Google Analytics