全面使用自动布局(AutoLayout )的开始

考虑到6和6+进入使用造成的“破坏”,自动布局这个武器“是时候表演真正的技术了!”。

刚在学习使用“约束”的时候,构建一个label准备试一试,在使用到init方法时,想到没必要设置frame,因为frame根本不能写死,但是我又想这个label有固定的大小,那怎么办呢?那就只用init方法构建,然后设置bounds,虽然可以,但是觉得浪费,而且这样设置的宽高没有添加“约束”,这样的宽高是不稳定的,会被改变的。

如果全面使用自动布局,直接设置宽高的方式已经不适合了,因为view的宽高是通过约束计算出来的,那么干嘛不直接在view构建的时候添加宽高约束呢?

所以我通过category给UIView添加了一种init方法:

-(id)initWithConstraintsSize:(CGSize)size{

    /*这里不采用super,因为这里是使用category添加方法不是继承UIView,使用super,那么调用的init方法就不是UIView的了。那么UIView构建时的一些系统内部处理就无法做,甚至init出来的可能缺少很多UIVew必须的元素。而使用【self init】,这样就使用了系统的UIView构建方法,所有必须的操作都不会被遗漏。
     */

    if (self = [self  init]) {

        NSLayoutConstraint* widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:(NSLayoutAttributeWidth) relatedBy:(NSLayoutRelationEqual) toItem:nil attribute:(NSLayoutAttributeNotAnAttribute) multiplier:1.0 constant:size.width];
        NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:(NSLayoutAttributeHeight) relatedBy:(NSLayoutRelationEqual) toItem:nil attribute:(NSLayoutAttributeNotAnAttribute) multiplier:1.0 constant:size.height];

        [self addConstraints:@[widthConstraint,heightConstraint]];
    }
    return self;
}

使用时只需要导入这个category,然后这样构建:

self.blueLabel = [[UILabel
alloc]initWithConstraintsSize:CGSizeMake(200,
250)];

这样这个label的宽高打死都不会改变了,不管你之后给它添加了什么其他的约束。

首先,我思考的问题是,在使用自动布局的环境里,再通过设置frame来设置view的大小可能没有作用,而且很被动。使用自动布局,首先就要转变思维习惯,大小不再是直接设定,而是通过约束计算出来。那么就有两种情况:

1、这个view我需要它和左边的XX保持m宽度,同时和右边的XXX保持n宽度,这样我的宽度就可以被计算出来;这种情况下这个view的宽是可变的,所以不需要设置frame。当然也不适用我上面的方法构建。

2、这个view的宽高时固定或阶段性固定的,这时就需要设置宽高,但是使用设置frame可能会没用,所以使用高宽的约束,但是我太懒了,觉得写起来麻烦,不如直接把添加宽高约束写到init方法里面,使用这个init方法构建出来的view就自带了宽、高约束,这样轻松多了!

这个简单的方法要这么仔细的说明,是我觉得这是一个开始,全面使用自动布局的开始,因为这样就可以完全抛弃掉使用frame来确定view的位置、大小的旧思路了。

当然还有一些问题:

1、如果这个view只想限定高(或宽)不变怎么办?

可以把init方法改为:

-(id)initWithConstraintsSize:(CGSize)size WidthConstraint:(BOOL)isWidth heightConstraint:(BOOL)isHeight{
    if (self = [self  init]) {

        NSLayoutConstraint* widthConstraint = [NSLayoutConstraint constraintWithItem:self attribute:(NSLayoutAttributeWidth) relatedBy:(NSLayoutRelationEqual) toItem:nil attribute:(NSLayoutAttributeNotAnAttribute) multiplier:1.0 constant:size.width];

        NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:self attribute:(NSLayoutAttributeHeight) relatedBy:(NSLayoutRelationEqual) toItem:nil attribute:(NSLayoutAttributeNotAnAttribute) multiplier:1.0 constant:size.height];

        if (isWidth) {
            [self addConstraint:widthConstraint];
        }

        if (isHeight) {
            [self addConstraint:heightConstraint];
        }
    }
    return self;
}

通过两个BOOL参数判断是否添加宽、高约束;

2、如果某个时候我想修改这个view的宽怎么办?

首先必须是通过修改宽约束,不是使用这是width,那么就必须取到宽约束,还好有方法取得自身的Constraint。可以在category里再加两个方法:

//获取宽约束
-(NSLayoutConstraint*)getWidthConstaint;

//获取高约束
-(NSLayoutConstraint*)getHeightConstant;

实现:

-(NSLayoutConstraint*)getWidthConstaint{

    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"identifier = %@",WConstraintID];
    NSLayoutConstraint* constraint =  [[self.constraints filteredArrayUsingPredicate:predicate] objectAtIndex:0];
    return constraint;
}

-(NSLayoutConstraint*)getHeightConstant{
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"identifier = %@",HConstainttID];
    NSLayoutConstraint* constraint =  [[self.constraints filteredArrayUsingPredicate:predicate] objectAtIndex:0];
    return constraint;
}

WConstraintID 和   HConstainttID 为两个宏,标记两个”约束“的id,并且在之前的inti方法里需要把这宽高约束的identifier设置好:

widthConstraint.identifier = WConstraintID;
heightConstraint.identifier = HConstainttID;

只要能够取到宽高约束,那么重设宽高或是去除都可以。

时间: 2024-10-11 11:52:24

全面使用自动布局(AutoLayout )的开始的相关文章

自动布局(AutoLayout)使用

/*1. 创建控件,并添加到当前的View中*/ self.rightButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; self.rightButton.translatesAutoresizingMaskIntoConstraints = NO; [self.rightButton setTitle:@"RightButton" forState:UIControlStateNormal]; [self.view 

Xcode6中自动布局autolayout和sizeclass的使用

一.关于自动布局(Autolayout) 在Xcode中,自动布局看似是一个很复杂的系统,在真正使用它之前,我也是这么认为的,不过事实并非如此. 我们知道,一款iOS应用,其主要UI组件是由一个个相对独立的可视单元构成,这些可视单元有的主要负责向用户输出有用的信息,有些则负责信息的输 入(交互),交互的过程中往往还伴随有动画的效果,已达到整个信息传递的连贯性以及用户体验的细腻感.可视单元,在实际开发中主要是view. button等,那么这些可视单元的关系由两个基本的关系构成:兄弟关系和父子关系

自动布局AutoLayout

Auto Layout 是iOS6发布后引入的一个全新的布局特性,其目的是弥补以往autoresizing在布局方面的不足之处,以及未来面对更多尺寸适配时界面布局可以更好的适应. 要完全掌握 Auto Layout 是一件非常消耗精力的事情,需要大量的实践,并且在根本上面,理解其如何使用,如果要全面的介绍 Auto Layout 和使用场景估计几篇博文都介绍不完, 本文希望能将使用 Auto Layout 的重点和技巧以及注意事项,进行一个介绍.成为学习 Auto Layout 的一个导航文章.

自动布局autoLayout解决不同屏幕

这篇不是autolayout教程,只是autolayout动员文章和经验之谈,在本文第五节友情链接和推荐中,我将附上足够大家熟练使用autolayout的教程.这篇文章两个月前就想写下来,但因为一直工作较多,没有时间来完成.今天终于狠下心,丢下代码不写,来完成他吧! 一.别和我提Autolayout,我想死!! 从iOS6/xcode4开始,苹果开始提供了autolayout——一种对不同屏幕尺寸有更好兼容的自动布局机制,但我相信大多数人在刚接触autolayout时,一定和我一样,几乎快被其折

iOS学习之自动布局-Autolayout

Autolayout: 最重要的两个概念: 约束:对控件位置和大小的限定条件 参照:对控件设置的约束是相对于哪一个视图而言的 自动布局的核心计算公式: obj1.property1 =(obj2.property2 * multiplier)+ constant value 解释:obj1的property1属性等于obj2的property2属性乘以multiplier(系数)再加constant(常量); 约束的优先级: 约束的priority属性表示约束的优先级,取值区间为[0,1000]

在storyboard/xib文件中实现自动布局 autolayout

1.注意事项 autolayout和frame属性是有冲突的,所以如果准备使用autolayout,就不要再代码中对控件的frame属性进行操作. 设置autolayout必须设置完全,必须包括位置信息和尺寸信息.也就是说必须有宽高和坐标位置,缺一不可. 回到顶部 2.简单示例 两个view(redView和blueView),等高等宽,redView距离左边和下边间距都是20,距离blueView间距也是20.blueView距离右边和下边都是20. 回到顶部 2.1.autolayout的相

自动布局autolayout使用总结(源码含swift版本)

一.概述 使用autolayout有一段时间了,Objective-C和swift下.iOS7和iOS8下都在用, 一路遇到了不少的坑,随遇随填,到今天也算是积累了不少经验了,这里总结一下, 通过自己新建的一个Doubi Demo来分享给大家.Doubi Demo我已上传到github上 去了(地址是:https://github.com/lihux/iLihuxAutoLayout),以后每篇文章的demo都 将放在github上,供大家参考.源码的workspace中有两个工程,分别使用OC

自动布局(autoLayout)演练2

那这一篇的练手的任务是: 如上图:红色记号代表间距都是20,两图片的高度都为40,最重要的一点:两图片的右边距(Trailing)对齐 1.添加两个uiview,我这是用的是storyboard拖的,两个uiview,设置好背景颜色 2.autoLayout与autosizing是重复的,不能混用,因此在xcode6.1以上要用autoLayout时,要在把zutosizing的勾去掉,要用autoLayout,把勾打上,因为这张图是xcode5.1,所以与xcode6不同 3.首先弄蓝色视图:

ios使用自动布局autolayout

在ios开发中经常用到自动布局,比如屏幕旋转来,界面就要从新摆放,不然就会显示不全. 自动布局一定要在storyboard界面里面设置,不能用纯代码的形式来写 要使用自动布局,首先要确保interface builder document里面的Use Auto Layout 和Use Size Classes 选项已经勾选??上了 图1:打开auto layout 这样在storyboard的右下角就会出现几个图形按钮:   分别是:stack.align.pin.和resolve auto l

IOS手动添加的View 在代码中使用(自动布局)autoLayout

- (void)viewDidLoad { [super viewDidLoad]; UIButton *btnTest = [UIButton buttonWithType:UIButtonTypeCustom];//不需要去刻意指定x,y的坐标,可以用CGRectZero btnTest.backgroundColor = [UIColor redColor]; btnTest.layer.borderColor = [UIColor yellowColor].CGColor; btnTes