哎, auto layout。。。。。

2014-11-29 01:25:36 +08:00
 jox
今天打算使用auto layout,折腾了半天,实在顶不住了,搞得脑袋疼,准备睡觉了。

好多人说auto layout刚开始确实会让人抓狂,但是最终还是值得的,既然大家都这么说,没办法,只能跟风了。

以前操作frame一切都很美好,一切都在掌控之中,进入了auto layout的世界后简直就像瞎了一般,一切都乱了套了,一个不小心程序就崩溃了,官方的文档还有bug,上网检索之后才知道文档上那地方瞎特么写,visual format语法的定义那没提如果不写orientation的话默认是水平方向,还得自己试,还有一些特性文档里没有,都得看别人的经验才能知道。。。

一开始说需要为每个view设定x,y,width,height,觉得也没什么嘛,frame不也一样嘛,结果马上就打脸了,发现远不止那么简单,UILabel,UITextView这样的高度与宽度互相影响,如果container view也是动态加载的话,那么container的尺寸也跟着受影响,放在table view的cell里的话好像还跟一般情况不一样,结果发现到头来似乎还得读一大坨文档和资料才能整明白layout的过程和原理,今天实在是搞得我脑袋疼,明天起来再看看吧,auto layout太让人沮丧了
4498 次点击
所在节点    iDev
13 条回复
typcn
2014-11-29 01:30:03 +08:00
我受不了,直接Disable Size Class
yellowV2ex
2014-11-29 02:01:29 +08:00
scrollView 的话,如果代码改了这个 scrollView 的 内容大小和contentSize,每当我滚动的时候,里面的东西就会自动复位,这个问题让我好生纠结。
WildCat
2014-11-29 07:00:07 +08:00
用习惯了你就根本停不下来…
推荐个入门文章 http://www.raywenderlich.com/83276/beginning-adaptive-layout-tutorial

其实这块的内容挺多, iOS 8 by Tutorials 这一块讲了一个章节
fkue0487
2014-11-29 09:14:47 +08:00
A = B * m + C,AutoLayout就是这么任性.
jox
2014-11-29 09:15:28 +08:00
@WildCat thanks man.

昨晚睡觉前我打开了一坨的网页,其中一个就是那个,当时实在太困了就把电脑扣上了,打算今天好好研究一下

http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

这个是objc.io的资料,里面有讲到layout process,虽然还没看,但是感觉也不错,如果有人对auto layout感兴趣可以看看。

auto layout能够减少大量的定位和计算尺寸的代码,以前如果打算对一个view的subview做flow式的排版,得反复计算frame,每个subview至少都要五六行代码,使用auto layout的话只需要修改subview的内容就行了,不用考虑layout,如果能整明白的话确实会让开发简单不少,希望我能整明白。。。
shiweifu
2014-11-29 09:48:49 +08:00
https://github.com/smileyborg/PureLayout

我是 storyboard 配合这个库来使用的,简单的规则 storyboard 来配置,心里没谱的自己写规则
krafttuc
2014-11-29 11:41:33 +08:00
Auto Layout 确实比较啰嗦。可以尝试一下第三方 wrapper。

PS: 写动画时,蛋疼无比的说。
hrx00747
2014-12-02 23:12:12 +08:00
用frame来定位一个view是绝对位置来定位
而auto layout来定位一个view是通过相对位置来定位,在iphone尺寸越来越多的情况下相对位置定位更灵活一些。

使用autolayout有两种方式:
1. IB中定义约束条件
2. 代码中定义约束条件
推荐尽可能在IB中定义约束条件,如果必须在代码中定义的话,推荐使用这个项目
https://github.com/Masonry/Masonry
jox
2014-12-03 15:36:34 +08:00
@hrx00747 其实还有第三种方式,可以在IB中定义约束,然后IBOutlet这些约束,然后在代码中根据情况修改这些约束的值,在设计界面的时候不能确定动态加载的对象的定位,比如同一个view,包含控件ABCD,A和D在所有的场景都会出现,B和C各自有各自的场景,比如table cell,因为cell需要被重用,有些cell需要显示B,有些需要显示C,D的定位依赖于B或者C的定位,这时候只需要设定D与A之间的关系,通过判断当前显示的是B和C来调整D与A之间约束的constant,不显示的就隐藏,这样就免去了在代码中创建对象和约束对象的开销,效率上和代码上都简化了。
hrx00747
2014-12-04 21:31:27 +08:00
@jox
你说的这种场景是不是定义两个cell更合适:
一个包含ADB,另外一个包含ADC
jox
2014-12-04 21:51:21 +08:00
@hrx00747 就只有一个控件的区别,两个prototype cell的话我得把其他的控件都弄成一样的,同样的约束得加两遍,没意思。其实还有两种用法,一种是把auto layout当frame用,加上x,y,width,height约束,然后IBOutlet,然后修改constant,这样就跟原来使用frame一样了,只要一修改某个约束,auto layout就会自动再生成新的frame。还有一种是frame和Auto Layout混着用,手动创建的view是可以配置frame的,在开启Auto Layout的情况下之所以修改frame不好使是因为修改frame之后,Auto Layout在之后的Layout环节会根据约束生成新的frame,导致之前设定的frame被覆盖了。手动创建的view如果不加任何约束的话,translatesAutoresizingMaskIntoConstraints默认是开启的,所以可以在Auto Layout工作之前设置frame。然后系统会根据frame自动生成约束,然后就跟在IB里创建的view一样了,都一起走update constraints --> layout -- > draw 这么个流程,在IB里创建的对象IB会自动关掉translatesAutoresizingMaskIntoConstraints,因为在IB里设置的约束已经足够定位了,这个属性就多余了。另外如果把某个view的所有在IB里创建的约束都去掉,并且也不开启translatesAutoresizingMaskIntoConstraints的话不知道会怎么样,没尝试过,不过应该会导致程序崩溃
hrx00747
2014-12-04 23:18:37 +08:00
@jox
可能是个人喜好吧 :)
我个人习惯在IB中定义约束条件。尽量不在代码中写
jox
2014-12-04 23:30:48 +08:00
@hrx00747 我也不在代码里手动加载约束,太啰嗦了,我要么直接修改frame,要么就把约束IBOutlet出来再根据情况修改constant属性,有些布局在design time是不能够决定的,只能在代码里手动做调整,嘿,我研究了几天AutoLayout,算是整明白了,现在感觉AutoLayout确实很好用!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/150126

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX