参考资料:
  • https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html
  • http://www.objc.io/issues/3-views/advanced-auto-layout-toolbox/,翻译:http://objccn.io/issue-3-5/
  • <iOS Auto Layout Demystified 2nd Edition>
  • http://blog.csdn.net/colorapp/article/details/38422073,我之前关于Autolayout的博客,讲述Autolayout的基本以及VFL的使用
  • http://stackoverflow.com/questions/20609206/setneedslayout-vs-setneedsupdateconstraints-and-layoutifneeded-vs-updateconstra/20927069?stw=2#20927069
  • http://stackoverflow.com/questions/20305654/what-is-the-difference-between-all-these-auto-layout-update-methods-are-all-nec
  • http://blog.shiqichan.com/UIScrollView-And-Autolayout/
  • https://github.com/forkingdog/UITableView-FDTemplateLayoutCell,http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/
spring & struts
就是指使用autosizing masks,它决定了一个view当它的superview的大小发生改变时,这个view会发生什么。具体来说:
the struts:指定了当superview改变大小时,view是否有灵活并且自动修复页边的处理能力。
UIViewAutoresizingFlexibleLeftMargin
UIViewAutoresizingFlexibleRightMargin
UIViewAutoresizingFlexibleTopMargin
UIViewAutoresizingFlexibleBottomMargin
the springs:指定了当superview改变大小时,view的宽和高的变化。
UIViewAutoresizingFlexibleWidth
UIViewAutoresizingFlexibleHeight
refer: http://www.cnblogs.com/chemandy/p/3551737.html
布局过程
与使用 springs & struts 相比,Auto Layout在视图被display(绘制)之前添加了两个额外的步骤: updating constraints(更新约束) 以及 laying out views(视图布局)。每一步都是依赖于前一步的操作的,display pass依赖于layout pass,layout pass依赖于updating constraints pass。
第一步: updating constraints pass
可以认为这个过程是测量阶段( “measurement pass”)。这是一个自底向上的过程(from subview to super view),为后续具体设置view的frame的layout过程准备必要的信息。可以通过调用 setNeedsUpdateConstraints来触发这个过程。尽管任何对约束系统的修改都将会自动触发这个过程。但是,在自定义view中,对于可能影响到layout的改变,通过这个调用来告知Auto Layout是非常有必要的。同时,在自定义view中,在这个阶段内可以通过覆盖 updateConstraints 方法来为这个view添加你需要的约束。
第二步: layout pass
这个是自顶向下的过程(from super view to subview)。在layout阶段,constraint system才真正开始影响views的布局,在OS X中,会设置view的frame;在iOS中,则是设置view的center和bounds。可以通过调用 setNeedsLayout来触发这个layout过程,但layout过程其实不会立即发生,而是将这个请求记录下来,稍后才会触发,这样的实现方式,就保证了我们不用担心很频繁地调用setNeedsLayout方法,这些调用可能最终会合并成一次layout过程。
可以通过调用 layoutIfNeeded(iOS)/layoutSubtreeIfNeeded(OS X)来让一个view tree立即更新layout过程。如果接下来的操作需要view最新frame之后进行,就可以通过调用这个方法来实现。在自定义view中,可以通过覆盖 layoutSubviews/layout 来对进行灵活地控制整个layout过程。
第三步: display pass
最后一步,display过程将会把views渲染到屏幕上,这个过程跟是否使用Auto Layout是无关的。这是一个自顶向下的过程,可以通过调用 setNeedsDisplay 来触发。setNeedsDisplay会触发一个被延迟的重绘,在这个中间,多次setNeedsDisplay调用最终会被合并为一次重绘。在自定义view中,可以通过覆盖drawRect:来灵活控制display过程。
由于每一步都需要基于之前的一步操作完成之后才能进行。所以,在display过程触发时,如果发现layout有没有被应用的修改,则首先会触发一个layout过程;同样地,layout 过程触发时,如果发现constraints发生了改变,则首先会触发update constraints过程。
需要注意的是,这三个步骤并不是单向的。Constraint-based layout是一个迭代式的过程。layout pass 可以基于之前的layout结果对constraints进行修改,这会再次触发一个constraints的更新过程,之后又会触发一个layout pass。这个特性可以用来为自定义view创建高级的layouts,但是如果自定义view的layoutSubviews方法中每次被调用都会触发另外一个layout pass,这样就会导致一个死循环之中。
在自定义View中使用Auto Layout
在实现自定义View时,我们需要知道下面这些与Auto Layout相关的概念:指定一个合适的intrinsic content size,区分view的frame和alignment rect,实现baseline-aligned layout,如果hook到layout过程。参考官方的文章:https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html
Intrinsic Content Size
The intrinsic content size is the size a view prefers to have for a specific content it displays. 关于intrinsic content size这个概念,翻译为固有内容尺寸。可以根据你需要展示的内容,来决定是否需要以及为哪个dimensions设置intrinsic content size。这点可以参考我之前的博文:http://blog.csdn.net/colorapp/article/details/38422073。总之来说,一般情况下,custom view中,这个其实用途不大,主要是用来理解 auto layout。
在UIView的头文件中,对需要设置intrinsic content size的场景描述很清楚
我之前的博文中的描述:
如果要在自定义view中设置intrinsic content size,你必须要做两件事:重写 intrinsicContentSize 根据展示的内容来返回一个合适的尺寸;当发生可能影响intrinsic content size的改变时,比如UILabel中改变font大小等,需要调用 invalidateIntrinsicContentSize。如果View只在某个dimension上有intrinsic content size,那就把另外一个dimension上的intrinsic content size设置为UIViewNoIntrinsicMetric。
需要注意的是,intrinsic content size跟view的frame无关的。
Compression Resistance and Content Hugging
所有View在两个dimensions(纬度)上都有Compression Resistance 和 Content Hugging属性。但是只有当View设置 intrinsic content size 的情况下,这些属性才会起作用。
1. Compression Resistance
As the name suggests, compression resistance refers to the way a view protects its content. A view with high compression resistance fights against shrinking. It won’t allow the content to clip. 
这段话来自<iOS Auto Layout Demystified 2nd Edition>,简单翻译一下,compression resistance 是一种view用来保护自身内容的方式,compression resistance较高的view可以抵制外界对view内容的挤压,避免view的内容显示不全。
需要注意:Compression resistance 的默认值是750。除了在IB中设置,可以使用类似的代码来进行设置:[button setContentCompressionResistancePriority:501 forAxis:UILayoutConstraintAxisHorizontal];
比如下面这个情形,“Compression resistance describes how a view attempts to maintain its minimum intrinsic content size.”,Compression resistance描述了一个view如何尝试来保持它自身最小的minimum intrinsic content size。我们把button的宽度设置40,明显小于button的intrinsic content size,上面的button有比较大的compression resistance。可以看出,上面的button成功把宽度维持在了它的intrinsic content size的大小,内容没有像下面的button那样被clip掉。
2. Content Hugging
Content Hugging refers to the way a view prefers to avoid extra padding around its core content or stretching of that core content (as with an image view that uses a scaled content mode). — From <iOS Auto Layout Demystified 2nd edition>
简单翻译一下,Content Hugging 是一种view用来避免core content外侧额外的padding或者避免对view的core content拉伸的方式。
Content hugging describes a view’s desire to match its frame to the natural size of its content. A strong hugging priority limits the view from growing much larger than the content it presents. A weak priority may allow a view to stretch and isolate its content among a sea of pad- ding. Because of iOS 7’s borderless buttons, I’ve added a light background tint to the button to highlight extents. — From <iOS Auto Layout Demystified 2nd edition>
需要注意的是,Content hugging默认的值是250。除了在IB中设置,可以使用类似的代码来进行设置:[button setContentHuggingPriority:501 forAxis:UILayoutConstraintAxisHorizontal];
比如下面这个情景,设置两个button的宽度大于他们的内容的尺寸,上面的button的hugging priority的值较大,所以没有被拉伸,保持了内容的收缩。下面的button的content hugging priority的值较小,所以它的内容被拉伸了。
总结
在Compression Resistance 和 Content Hugging的背后,Auto layout会首先把 intrinsic content size 和 这两个优先级值转为constraints,比如对于一个content size为{100, 30}的label,它的默认的水平/垂直的Compression Resistance的优先级都是750,默认的水平/垂直的 Content Hugging的优先级都是250。最终,这些条件会转换为4个constraints:
Frame vs. Alignment Rect
Auto Layout 并不会操作view的frame,而是操作他们的alignment rect。由于大多数情况下,这两个概念是相同的,所以很容易忘记他们之间的细小差别。实际上,alignment rects 是一个强大的新概念,利用它可以把view的layout alignment edges跟外观解耦。
“When you include embellishments in your pictures such as shadows, sparkles, badges, and other items that extend beyond the image’s core content, an image’s natural size may no longer reflect the way you want Auto Layout to handle layout. In Auto Layout, constraints determine view size and placement, using a geometric element called an alignment rectangle. The UIKit API calls help you control that placement.” — <iOS Auto Layout Demystified 2nd>
关于Alignment Rectangle,我自己的理解是Auto Layout引入这个概念,主要是为了解决添加一些视觉效果之后而影响真正的内容的无法正常展示的问题。由于Auto Layout是通过约束来设置View各种属性来布局的,比如center,这个时候如果有些view设置了额外的视觉效果的话,比如阴影,这个时候如果我想设置这个view居中显示(只设置这个view的核心内容居中,不包括阴影部分),就会非常麻烦,我需要计算阴影的大小来调整center的值,显然这个不符合Auto Layout减轻工作量的目的,所以Auto Layout就引入了Alignment Rectangle这个概念。可以参考下图,显然,我们需要右边的居中,而不是左边这种居中。
当我们在开发比较复杂的view的时候,可能会引入一些类似阴影或者倒影之类的装饰物。为了实现添加特性,我们尝尝采用的方式是把这些特性绘制到image上面,而不是通过添加子view来实现。添加装饰物之后,跟frames不同的是,一个view的alignment rectangle应该仅仅用于核心的可见元素,而不包括其他的装饰物view,类似阴影倒影等。如下面的左侧的button,我们这边对这个view进行布局的时候,我们希望Auto Layout可以只针对蓝色区域的核心内容进行对齐,不包括装饰物。下图中间的图片中,使用黑色边框高亮了它的alignment rectangle,可以看到这个矩形并不包括shadow和badge这些装饰物。这个部分才是我们希望Auto Layout布局时考虑的。与中间这个图片相反是右侧的图片中矩形,这个rect把所有的可见元素都包含了进去。包含这些装饰物之后,在layout的过程中,就非常有可能会影响view的各种对齐特性(比如,center,bottom,right)。比如你设置view的center跟superview的center对齐,但是这时,其实它们之间并不对齐。
Auto Layout通过使用alignment rectangles代替frames,可以保证布局过程中,view的很多关键布局信息(比如,view的edges,center)可以被正常考虑。
例如下图,由于Auto Layout在布局过程中只考虑alignment rectangle,所以在布局这个view相对它的superview居中时,shadow和badge这些装饰物就无法影响这个view的摆放。
我们可以通过设置Xcode来让view显示它的alignment rectangles,这个用来调试非常方便:
From objc.io: 
使用alignment rects可以非常定义定义一个用来布局的矩形,大多数情况下,我们只需要重写 alignmentRectInsets 方法即可,这个方法允许你返回相对于frame的edge insets(内边距)。需要更灵活的控制的话,可以通过重写 alignmentRectForFrame: 和 frameForAlignmentRect: 来实现,如果是希望可以根据frame来alignment rect而不是减去一个固定的insets的话,这两个方法非常有用,但是需要注意的是,这两个方法实现的时候,必须是可以相互转换的。
需要强调的是,intrinsic content size指的是view的alignment rect,而不是它的frame。因为Auto Layout直接从intrinsic content size中生成 compression resistance 和 content hugging constraints,所以这个说法是有道理的。
总结
由于我们大多数情况下,并不需要使用自己绘制view,所以对于这个部分,我们只说一下概念的理解,还有上面这部分从objc.io上面翻译过来的内容之外,就不再多说了,有需要的话,可以查看<iOS Auto Layout Demystified>这本书,讲解的非常清晰。
Baseline Alignment
Auto Layout中,对于那些有baseline问题的自定view, 必须要设置NSLayoutAttributeBaseline属性之后才能起作用。
在iOS中,可以通过覆盖实现 viewForBaselineLayout 来启用 baseline alignment ,这个方法中返回的view的底部区域就是view的baseline。
Taking Control of Layout
如果我们是通过把多个subviews组合到一起构成custom view,我们就必须对这些subview进行layout。在一个Auto Layout环境中,最自然的方式就是为这些subviews添加local constraints。但是需要注意的是,这样一来,这个custom view就必须依赖Auto Layout了。所以,这种方式实现custom view时,我们最好明确指出对Auto Layout的依赖,即实现 requireConstraintsBasedLayout,并且返回YES。
Intrinsic Content size of Multi-Line Text
关于Intrinsic Content Size,UILabel的多行显示问题,是否需要设置preferredMaxLayoutWidth,感谢群友 Answer-huang: 
http://stackoverflow.com/questions/25398312/automatic-preferred-max-layout-width-is-not-available-on-ios-versions-prior-to-8
http://stackoverflow.com/questions/17491376/ios-autolayout-multi-line-uilabel
http://www.brightec.co.uk/blog/preferredmaxlayoutwidth
http://stackoverflow.com/questions/16009405/uilabel-sizetofit-doesnt-work-with-autolayout-ios6
“iOS 8 added support for automatically computing preferredMaxLayoutWidth at runtime, which makes creating multiline labels even easier. This setting is not backwards compatible with iOS 7. To support both iOS 7 and iOS 8, Xcode 6 allows you to pick either "Automatic" or "Explicit" for preferredMaxLayoutWidth in the size inspector.”
即在iOS8一下的设备中,我们使用多行文字的UILabel的话,就必须得先设置UILabel的 preferredMaxLayoutWidth,这个时候UILabel才能计算出需要几行来显示,而在iOS8中则实现了 preferredMaxLayoutWidth 的自动计算,不需要我们再设置。在iOS 8以下的系统中,解决这个问题有几种方式:
http://www.objc.io/issues/3-views/advanced-auto-layout-toolbox/
1. 重写UILabel的super view的layoutSubviews方法
注意这里调用了两次 [super layoutSubviews]; ,跟我们前面说的layout的步骤结合解释一下。第一次调用 [super layoutSubviews] 之后,label才能被正确地设置frame。第二次调用[super layoutSubviews]则是重新触发layout过程,layout过程中,发现label的约束有改变,则会先触发约束更新的过程,这样就对UILabel进行了重新布局。如果我们遗漏了第二次[super layoutSubviews];调用的话,就会得到一个 NSInternalInconsistencyException错误,因为我们在layout pass步骤中,对约束进行了修改,但是我们没有再次触发layout pass,所以也就导致这些修改了的约束就无法被作用。
2. 子类化UILabel
这个地方没有跟第一个方法一样,首先调用[super layoutSubviews],是因为当UILabel的layoutSubviews被调用的时候,它的frame就已经设置好了,所以不需要我们再去调用。至于在设置完preferredMaxLayoutWidth之后才调用[super layoutSubviews],跟上一步的理由一样,触发layout pass来把已经发生改变但是还没来得及apply的constraints进行作用。
这个地方,我添加了一些宏来进行了简单的实现,在最低支持版本变为iOS8的时候,提示修改
3. 覆盖ViewController的viewDidLayoutSubviews
最后一点需要注意的是,检查一下你是否通过约束对Label的高度设置了一个固定值,并且这个约束的优先级是大于label的content compression resistance 优先级的。
Animation
使用Auto Layout进行布局的view要做动画的话,有两种基本的策略:对constraints自身做动画;改变constraints来重新计算view的frame,然后使用 Core Animation 来对旧位置和新位置之间进行插值。这两种方式的差别在于,对于constraints自身进行动画得到的结果,对constraints system会一直是有效的;与之不同,使用Core Animation在新frame和旧frame之间进行插值动画,可能会使约束在某个时期内失效。
需要注意的是,直接操作constriants进行动画,目前来说在OS X上是可行的。不过在iOS上,这种方式是要比通过Core Animation进行动画性能差很多,这点目前对于iOS来说是一个非常大的问题。
Auto Layout中进行Core Animation动画,概念上来说跟不使用Auto Layout进行Core Animation动画是一样的。区别只是在于你不能直接设置view的frame来进行动画,而是需要修改view的constraints,然后触发一个layout pass,让这个layout pass来设置view的frame。具体来说,在iOS中,非Auto Layout中进行Core Animation动画:
在Auto Layout中进行Core Animation动画(https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutbyExample/AutoLayoutbyExample.html):
在Auto Layout中使用Core Animation作动画,对view的constraints的修改不仅仅局限于修改constraints的constant,可以移除/添加constraints,甚至创建只用于animation的临时constraints。
最需要注意的事情是,在Auto Layout中使用Core Animation时不能直接修改view的frame。只要一个View是通过Auto Layout进行布局的,就必须通过layout system来设置这个view的frame。如果使用其他方式修改view的frame,与Auto Layout布局结果不一致的话,就可能会导致一些很奇怪的问题。
这也意味着在Auto Layout中,如果要进行的view transforms能改变view的frame的话,就可能会导致一些问题。
上面这个view transforms,一般来说我们是期望这个view以它的center point为中心进行缩放变换。但是在Auto Layout中,会发生什么行为是根据我们对这个view设置的constraints决定的。如果我们设置的constraints是让这个view相对于它的super view居中的,那么结果是符合我们期望的。因为设置transform会触发一个layout pass,但这个过程中设置的新的frame仍是相对于super view居中的,结果仍是符合居中的约束的。但是,如果设置的view的constraints是让view的左边距相当于另外一个view进行布局的,这个时候就会有问题,变换之后view的frame仍然是需要符合这个约束的,即x值不便,但是这样一来,view的center point就会发生移动。
不管怎么说,对于使用constraints进行布局的view,进行这种导致frame和constraints不符的transforms都不太好,即使结果符合我们的预期。view的frame和constraints如果不同步的话,非常容易导致很奇怪的问题出现。
如果我们想要使用transfroms来对view做动画,或者直接对view的frame做动画,最好的方式是”embed the view into a container view”。
关于transform 和 Auto Layout一起使用讨论,在stackoverflow上面有一个答案非常经常,可以作为参考:http://stackoverflow.com/questions/12943107/how-do-i-adjust-the-anchor-point-of-a-calayer-when-auto-layout-is-being-used/14105757#14105757
Debugging
Unsatisfiable Constraints
使用po命令查看指针:
或者使用一种更加可视化的调试方式,使用expr命令修改背景色等:
也可以使用instrument的allocations模板来profile这个应用,从error message中拿到内存地址之后,可以切换到Instruments的detail view来查看Objects List,搜索这个内存地址,这样就可以得到这个object是在哪个method中alloc的,这是一个非常好的提示信息。
可以通过重写 NSLayoutConstraints的description方法来获得unsatisfiable constraints的信息。可以参考github上面的实现:https://github.com/objcio/issue-3-auto-layout-debugging
Ambiguous Layout
Auto Layout一种常见的问题就是 Ambiguous Layout。UIView/NSView 提供三种用来检测 ambiguous layout的方法:hasAmbiguousLayout,exerciseAmbiguityInLayout 和私有方法 _autolayoutTrace。
如果有Ambiguous Layout的话,hasAmbiguousLayout会返回YES;使用_autolayoutTrace可以递归打印出整个view树的结构。下面是我们项目中有Ambiguous Layout的View使用_autolayoutTrace打印结果:
由于_autolayoutTrace方法是一个私有方法,需要使用DEBUG宏包括,在正式上线时避免编译进去。
另外一种可以可视化形式指出ambiguous layouts的方式是使用 exerciseAmbiguityInLayout。这个方法会随机挑选一个有效的值来修改view的frame。但是调用一次这个方法只会修改一次frame,所以大部分情况下是看不到这个view的frame的变化。下面这个方法是一种不错的思路,可以让那些有ambiguous layouts的view来回跳动:
NSUserDefault Options
我们可以设置一些很有用的NSUserDefault 选项来调试和测试 Auto Layout。可以直接通过代码设置或者在scheme editor中指定启动参数来设置。上文中UIViewShowAlignmentRects参数设置来显示 alignment rects 就是一种。
NSDoubleLocalizedStrings 可以把所有的localized string的长度加倍,可以用来测试超长字符串。
设置AppleTextDirection和NSForceRightToLeftWritingDirection为YES来模仿一个right-to-left的语言。
Perfromance
由于Auto Layout是在layout process中额外添加的一步操作,所以使用Auto Layout必然会对性能上带来一定的影响。但是在大部分情况下,用来解析constraint system的时间几乎是可以忽略不计的。但是如果在对性能上又很严格的要求的场合,最好还是注意一下这个问题。
我们可以借助Instruments工具来精确测量Auto Layout的消耗。通过监控NSISEngine类的方法。
另外一个需要注意性能的场景是一次性显示很多views。把constraints转换为frame的constraint solving algorithm (http://constraints.cs.washington.edu/cassowary/)  的复杂度是super-linear的。这意味着当view的数量超过一个临界点之后,performance就会变得非常糟糕。这个特定的number是根据你特定的用户场景决定的。在目前的iOS设备上,这个number为100左右。查看更详细的信息,可以查看这篇文章:http://pilky.me/36/ 和 http://floriankugler.com/2013/04/22/auto-layout-performance-on-ios/。
记住这些都是极端情况,所以没必要过早地优化,只需要尽力避免潜在的性能方面的影响即可。不是非常极端的问题,就不需要转换为使用设置frames这种方式来实现。进一步来说,硬件会变得越来越好,而且Apple会持续优化Auto Layout的性能。所以这种极端情况只会越来越少。
AutoLayout与UIScrollView的结合
在ScrollView中添加view之后,一直出现下图中的错误提示:
我的解决方式,参考下面第一个文章,是在添加一个contentView在scrollview中,然后把所以的subviews都添加到这个contentView上。
参考:
1. http://tech.glowing.com/cn/practice-in-uiscrollview/
2. https://developer.apple.com/library/ios/technotes/tn2154/_index.html
VFL补遗
Metrics
metrics让我们在VFL中可以使用一个字符串代替常量,这个特性在我们日常工作中非常有用:
Retrieving Constraints by Axis
由于Auto Layout是根据不同的坐标轴来设计的,我们可能想要根据垂直和水平方向来获取不同的constraints。在debugging中,可以使用 constraintsAffectingLayoutForAxis: 方法来获取各个方向的constraints,但是这个不是App Store-safe的,只能用在development中
Connection
empty connection:对于那些应该自然连接在一起的view,我们使用empty connection来连接这些view。empty connection 让一个view可以直接跟在另一个view后面。例如:H:[view1][view2]
standard spacers:使用”-“符号来表示一个固定的标准间距(standard gaps)。尽管没有正式的文档,这个标准间距在view-to-view之间是8个点,view-to-superview是20个点。Standard gaps确保那些相关但是又有区分的views之间有足够的可见间距。
有关问题记录
SWTableViewCell源码分析,总结其中的手势的应用,以及关于Autolayout与非AutoLayout的总结,https://github.com/CEWendel/SWTableViewCell/issues/139 / http://stackoverflow.com/questions/12610783/auto-layout-still-required-after-executing-layoutsubviews-with-uitableviewcel / https://github.com/CEWendel/SWTableViewCell/issues/139
setNeedsLayout/layoutIfNeeded/layoutSubview/setNeedsUpdateConstraints的区别:http://stackoverflow.com/questions/20609206/setneedslayout-vs-setneedsupdateconstraints-and-layoutifneeded-vs-updateconstra/20927069?stw=2#20927069,http://stackoverflow.com/questions/20305654/what-is-the-difference-between-all-these-auto-layout-update-methods-are-all-nec, https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AutoLayoutConcepts/AutoLayoutConcepts.html

Advanced Auto Layout相关推荐

  1. Advanced Auto Layout Toolbox

    原文地址:https://www.objc.io/issues/3-views/advanced-auto-layout-toolbox/ Auto Layout was introduced in ...

  2. Advanced Auto Layout:Programmatically Creating Constraints

    Programmatically Creating Constraints以编程方式创建约束 Whenever possible, use Interface Builder to set your ...

  3. 深入剖析Auto Layout,分析iOS各版本新增特性

    先前写到的一篇Masonry心得文章里已经提到了很多AutoLayout相关的知识,这篇我会更加详细的对其知识要点进行分析和整理. 来历 一般大家都会认为Auto Layout这个东西是苹果自己搞出来 ...

  4. 【Auto Layout】Xcode6及以上版本,创建Auto Layout 约束时产生的一些变化【iOS开发教程】...

    [#Auto Layout#]Xcode6创建Auto Layout 约束时产生的一些变化     通过两个小Demo来展示下变化: Demo1需求: 为控制器的根视图(图中的"控制器Vie ...

  5. 转载:使用Auto Layout中的VFL(Visual format language)--代码实现自动布局

    本文将通过简单的UI来说明如何用VFL来实现自动布局.在自动布局的时候避免不了使用代码来加以优化以及根据内容来实现不同的UI. 一:API介绍 NSLayoutConstraint API 1 2 3 ...

  6. iOS6 自动布局 入门–Auto Layout(转)

    iOS6 自动布局 入门–Auto Layout(转) 标签: 杂谈   目前为止,即使你的界面设计是在合理的复杂度内,你也必须要为之写许多代码来适应变化的布局.现在我相信你会很高兴听到这种情况将不会 ...

  7. Unity2017.1官方UGUI文档翻译——Auto Layout

    Auto Layout 自动布局 The Rect Transform layout system is flexible enough to handle a lot of different ty ...

  8. iOS屏幕适配方案-Auto Layout

    市场上的android手机五花八门.各种尺寸的屏幕让android程序员们比較头疼. 也有一些大神写了一些博客提出了自己的观点.iOS貌似也迎来了大屏6+,因此屏幕适配的问题也是有滴,因此苹果也有自己 ...

  9. IOS使用Auto Layout中的VFL适配

    做登录页面,之前做都是用frame做,今天想着用Auto Layout中的VFL来做.觉得做的效果还是可以的(自恋一下下). 首先看下效果图和标记图 自己在做的过程中也遇到了好多问题,不过也一个一个的 ...

  10. Auto Layout 和 Constraints

    文章修改 2月1日:添加使用约束.编辑约束和iOS特性三个部分 2月24日:根据自己的理解,修改iOS特性部分的内容 自动布局Auto Layout Auto Layout,通过设置在View上的约束 ...

最新文章

  1. DCN-cs6200 ipv6 6to4隧道
  2. 解决端口 windows10 端口被占用的问题
  3. python dataframe 如何去除缺失值
  4. php5.5 mysql密码无法_php – Mysql无法连接 – 访问被拒绝(使用密码是)
  5. 【Demo 0062】目录及文件基本操作
  6. Tensorflow Lite 编译
  7. Python语法基础(长期)
  8. 时间处理总结(二)oracle
  9. 获取系统信息2——linux中使用随机数
  10. 求最大公约数——辗转相除法
  11. PS 使用批处理来另存为图片
  12. 新手学编程?选python吧!
  13. 在PGConf.Asia-中文技术论坛,聆听腾讯云专家对数据库技术的深度理解
  14. 2021-09-09 文献阅读 Predicting circRNA-disease associations based on autoencoder and graph embedding
  15. 《极限逃亡》12.3正式上线链游玩家|末日围城、文明重启
  16. 金蝶K/3 固定置产相关SQL语句
  17. java.lang.RuntimeException: Parcel: unable to marshal value com.
  18. MATLAB面板布局—便捷美观
  19. 云诊所管理系统(联合诊疗)支持远程高清视频会诊
  20. 【荐读】职场生存法则和智慧

热门文章

  1. 安卓电子书格式_不用电脑,6招教你把手机上的电子书传输到Kindle上
  2. 修复40G的老IDE硬盘
  3. banner设圆角_Banner设计技巧!
  4. 《前端框架开发技术》HTML+CSS+JavaScript 制作个人简历模板
  5. html5手机的注册页面,H5页面结合vue实现登录注册组件
  6. App自动化测试工具Airtest
  7. 抓包教程(安卓抓包)Fiddler,HttpCancy使用~浅谈前几日抓包中遇到的坑
  8. 家庭水族馆,智能加热棒解决方案
  9. selenium打开网址
  10. 斯坦福大学CS224N-深度学习与自然语言处理:课程1-笔记