NSLayoutConstraint 1【转】

                       原文:http://blog.csdn.net/djl4104804/article/details/20768901

首先说按比例缩放,这是在Interface Builder中无法设置的内容。而在代码中,使用NSLayoutConstraint类型的初始化函数中的multiplier参数就可以非常简单的 设置按比例缩放。同时也可以设置不同NSLayoutAttribute参数来达到意想不到的效果,比如“A的Width等于B的Height的2倍”这 样的效果。

OK,开始写代码,我们就拿一个简单的UIButton做示例,在ViewController中创建一个UIButton字段:

UIButton *btn;

命令这个Button水平居中,始终距离父View底部20单位的距离。然后高度是父View高度的三分之一。

最后使用KVO来监控Button的大小并实时输出到屏幕上。

代码:

- (void)viewDidLoad

{

[super viewDidLoad];

//创建UIButton,不需要设置frame

btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

[btn setTitle:@"mgen" forState:UIControlStateNormal];

btn.backgroundColor = [UIColor greenColor];

[self.view addSubview:btn];

//禁止自动转换AutoresizingMask

btn.translatesAutoresizingMaskIntoConstraints = NO;

//居中

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:btn

attribute:NSLayoutAttributeCenterX

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeCenterX

multiplier:1

constant:0]];

//距离底部20单位

//注意NSLayoutConstraint创建的constant是加在toItem参数的,所以需要-20。

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:btn

attribute:NSLayoutAttributeBottom

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeBottom

multiplier:1

constant:-20]];

//定义高度是父View的三分之一

[self.view addConstraint:[NSLayoutConstraint

constraintWithItem:btn

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeHeight

multiplier:0.3

constant:0]];

//注册KVO方法

[btn addObserver:self forKeyPath:@"bounds" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionInitial context:nil];

}

//KVO回调

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context

{

if (object == btn && [keyPath isEqualToString:@"bounds"])

{

[btn setTitle:NSStringFromCGSize(btn.bounds.size) forState:UIControlStateNormal];

}

}

运行结果:

OK,没有任何问题。

接下来有一个新的需求,在横向的显示中,Button的高度只有96,觉得他太短了,所以要求Button的最小高度为150。

这样的话,需要加入另一个限制大小的Constraint,但是这两个Constraint 在某些情况下是有冲突的,我们可以通过设置Constraint的优先级来解决。优先级对应NSLayoutConstraint类型的priority 属性,默认值是UILayoutPriorityRequired,数值上等于1000. 设置一个低的值代表更低的优先级。

另外对于最小值的定义,使用NSLayoutRelationGreaterThanOrEqual作为NSLayoutConstraint类型创建时的relatedBy参数。

修改上面的比例Constraint,并在下方加入一个新的限制最小值的Constraint,代码:

//定义高度是父View的三分之一

//设置优先级低于UILayoutPriorityRequired(1000),UILayoutPriorityDefaultHigh是750

NSLayoutConstraint *con = [NSLayoutConstraint

constraintWithItem:btn

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationEqual

toItem:self.view

attribute:NSLayoutAttributeHeight

multiplier:0.3

constant:0];

con.priority = UILayoutPriorityDefaultHigh;

[self.view addConstraint:con];

//设置btn最小高度为150

[btn addConstraint:[NSLayoutConstraint

constraintWithItem:btn

attribute:NSLayoutAttributeHeight

relatedBy:NSLayoutRelationGreaterThanOrEqual

toItem:nil

attribute:NSLayoutAttributeNotAnAttribute

multiplier:1

constant:150]];

运行后,横向屏幕中的Button高度成了150:

时间: 2024-10-22 02:49:43

NSLayoutConstraint 1【转】的相关文章

- (void)addConstraints:(NSArray<__kindof NSLayoutConstraint *> *)constraints

Adds multiple constraints on the layout of the receiving view or its subviews.   All constraints must involve only views that are within scope of the receiving view. Specifically, any views involved must be either the receiving view itself, or a subv

使用autolayout的NSLayoutConstraint类中的constraintWithItem 、constraintsWithVisualFormat这两个类方法来创建视图并可以实现自动布局

#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; [self createViewWithConstraintItem]; [self createViewWithConstraint]; } - (void)createViewWithConstraintItem {

NSLayoutConstraint的简单应用

UIView *topView = [[UIView alloc] init]; topView.backgroundColor = [UIColor redColor]; [self.view addSubview:topView]; topView.translatesAutoresizingMaskIntoConstraints = NO; [self.view addConstraints:@[ [NSLayoutConstraint constraintWithItem:topView

iOS中文API之NSLayoutconstraint

AutoLayout为开发者提供了一种不同于传统对于UI元素位置指定的布局方法.以前,不论是在IB里拖放,还是在代码中写,每个UIView都会有自己的frame属性,来定义其在当前视图中的位置和尺寸.使用AutoLayout的话,就变为了使用约束条件来定义view的位置和尺寸.这样的最大好处是一举解决了不同分辨率和屏幕尺寸下view的适配问题,另外也简化了旋转时view的位置的定义,原来在底部之上10像素居中的view,不论在旋转屏幕或是更换设备(iPad或者iPhone5或者以后可能出现的mi

AutoLayout的三种设置方式之——NSLayoutConstraint代码篇

AutoLayout是从IOS 6开始苹果引入来取代autoresizing的新的布局技术,该技术有三种设置方式,等下我来为大家一一叙述一下. 在说三种设置方式前,我们先简单的说一下autolayout能够设置哪些行为. 1.视图的大小(即视图的绝对大小). 2.视图的位置(视图相对于父视图或者兄弟视图的位置). 3.视图的对齐方式(相对于父视图或者相对于兄弟视图). 可以看到autolayout相比autoresizing技术来说要灵活的多,该技术有很多布局的约束设置.这次主要讲的用代码来设置

NSLayoutConstraint 使用详解

注意 使用前必须先取消所有的你想设置View 的 Autoresizing 属性 因为 Autoresizing  Layout不能共存  系统默认是 Autoresizing for v in subviews { v.translatesAutoresizingMaskIntoConstraints=false } 自动布局核心公式 view1.attr1 = view2.attr2 * multiplier + constant 自动布局构造函数 NSLayoutConstraint(it

iOS动态管理AutoLayout的约束NSLayoutConstraint

除了使用Storyboard之外,也可以使用使用代码的方式,动态的向指定的UIView,添加约束. 例如有两个UILabel:someLabel,otherLabel 首先用代码实例化,两个控件 self.someLabel = [[UILabel alloc]initWithFrame:CGRectZero]; self.someLabel.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:self.in

IOS页面自动布局 之 NSLayoutConstraint基础篇

使用AutoLayout之前需要知道以下两点: 1.必须设置 translatesAutoresizingMaskIntoConstraints为NO. 2.如果是viewControl则AutoLayout适配写在[- updateViewConstraints]中: 如果是view则AutoLayout适配写在[- updateConstraints]中. 一.要讲解的方法: 1 /* Create constraints explicitly. Constraints are of the

代码方式使用AutoLayout (NSLayoutConstraint + Masonry)

随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为迫切和必要.(包括:iPhone4/4s,iPhone5/5s,iPhone6/6s,iPhone 6p/6ps). 在iPhone6出现以前,我们接触的iPhone屏幕只有两种尺寸:320 x 480和320 x 568.所以在那个时候使用传统的绝对定位(Frame)方式进行界面控件的布局还是比较轻松的,因为我们只需要稍微调整一下Frame就可以适配这两种大小的屏幕了.也许这也是为什么虽然AutoLayou