AutoLayout的一些使用心得

上周终于把前段的密集课程及考试什么的完成了,有时间来review下YoNote里的代码。虽然说代码好像写了很多,但能说的好像不太多==这篇准备说下使用AutoLayout的一些感觉。布局

概述

AutoLayout是什么

个人理解是,AutoLayout是经过对界面上各个元素设定约束,来达到在各个不一样设备上统一布局的目的。spa

AutoLayout实现方式

实现AutoLayout整体上说有两种方式,一种是在Xib里直接设置,另外一种是使用代码。其中使用代码的方式经常使用的有如下几种:code

  • 苹果本身的AutoLayout方法
  • 第三方库PureLayout
  • 第三方库Masonry
  • 别的...

对我来讲,苹果那堆代码太繁琐抽象,Masonry没去看过==,因此要么用Xib,要么用PureLayout。到底选用哪种,通常取决于须要布局的元素的复杂程度。若是须要控制的元素不少或者是一个View上有不少子View,我会选择用Xib,毕竟代码写起来太费时间了;相反,若是界面不复杂、要控制的元素比较少,或者元素可能会发生变化,我会考虑用代码,使用啊或者控制方便一些。blog

到底应该怎么布局

这个我还不能像某大神那么自信地说“什么界面都能在两(半)小时里作出来”连接,偶尔有的元素仍是会不乖乱跑,可是大致上有个思路。get

个人思路是抓住主要矛盾,在布局中究竟是哪一个元素是“自变量”,由于它别的元素的位置才会跟着变化,先肯定自变量,别的元素跟着就肯定下来了。it

一个例子


好比YoNote的ItemCell,效果图以下:io

itemcell.png

分析能够知道它的问题在于memoLabel内容显示这个view必须固定在左上方,并且与collectionLabel的距离是固定的;同时imageView也必须固定在右边。
具体来讲,在这个cell里面,memoLabel和imageView是必须首先固定的,由于三个label都与imageView有必定的距离,这个距离只有当imageView固定以后才能肯定;一样,collectionLabel与memoLabel的距离也只有当memoLabel固定以后才能肯定。class

因而,按这个思路,先固定imageView(与父视图contentView的上下右距离肯定)变量

[self.iv autoPinEdgesToSuperviewEdgesWithInsets:ALEdgeInsetsMake(kLabelVerticalInsets, kLabelHorizontalInsets, kLabelVerticalInsets, kLabelHorizontalInsets) excludingEdge:ALEdgeLeading];

而后是memoLabel,与父视图的左边及上边肯定,而后肯定高度以及和imageView的距离。(宽度不用管了,左边与父视图的距离以及右边与imageView的距离肯定就能肯定宽度,高度必定要固定,方能固定collectionLabel)方法

[self.memoLabel autoPinEdgeToSuperviewEdge:ALEdgeTop withInset:kLabelVerticalInsets];  
[self.memoLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets];
[self.memoLabel autoSetDimension:ALDimensionHeight toSize:kMemoLabelHeightToSize];
[self.memoLabel autoPinEdge:ALEdgeTrailing toEdge:ALEdgeLeading ofView:self.iv withOffset:-kLabelHorizontalInsets relation:NSLayoutRelationLessThanOrEqual];

最后是collectionLabel和tagLabel,与父视图保持左边的距离,同时collectionLabel与memoLabel以及tagLabel在上下保持距离。

[self.collectionNameLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets];
[self.tagLabel autoPinEdgeToSuperviewEdge:ALEdgeLeading withInset:kLabelHorizontalInsets];
[self.collectionNameLabel autoPinEdge:ALEdgeTop toEdge:ALEdgeBottom ofView:self.memoLabel withOffset:kLabelVerticalInsets];
[self.collectionNameLabel autoPinEdge:ALEdgeBottom toEdge:ALEdgeTop ofView:self.tagLabel withOffset:-kLabelVerticalInsets];

Done!

相关文章
相关标签/搜索