哎, auto layout。。。。。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
jox
V2EX    iDev

哎, auto layout。。。。。

  •  
  •   jox 2014-11-29 01:25:36 +08:00 5171 次点击
    这是一个创建于 4005 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天打算使用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太让人沮丧了
    13 条回复    2014-12-04 23:30:48 +08:00
    typcn
        1
    typcn  
       2014-11-29 01:30:03 +08:00
    我受不了,直接Disable Size Class
    yellowV2ex
        2
    yellowV2ex  
       2014-11-29 02:01:29 +08:00
    scrollView 的话,如果代码改了这个 scrollView 的 内容大小和contentSize,每当我滚动的时候,里面的东西就会自动复位,这个问题让我好生纠结。
    WildCat
        3
    WildCat  
       2014-11-29 07:00:07 +08:00 via iPhone
    用习惯了你就根本停不下来…
    推荐个入门文章 http://www.raywenderlich.com/83276/beginning-adaptive-layout-tutorial

    其实这块的内容挺多, iOS 8 by Tutorials 这一块讲了一个章节
    fkue0487
        4
    fkue0487  
       2014-11-29 09:14:47 +08:00
    A = B * m + C,AutoLayout就是这么任性.
    jox
        5
    jox  
    OP
       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
        6
    shiweifu  
       2014-11-29 09:48:49 +08:00
    https://github.com/smileyborg/PureLayout

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

    PS: 写动画时,蛋疼无比的说。
    hrx00747
        8
    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
        9
    jox  
    OP
       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
        10
    hrx00747  
       2014-12-04 21:31:27 +08:00
    @jox
    你说的这种场景是不是定义两个cell更合适:
    一个包含ADB,另外一个包含ADC
    jox
        11
    jox  
    OP
       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
        12
    hrx00747  
       2014-12-04 23:18:37 +08:00
    @jox
    可能是个人喜好吧 :)
    我个人习惯在IB中定义约束条件。尽量不在代码中写
    jox
        13
    jox  
    OP
       2014-12-04 23:30:48 +08:00
    @hrx00747 我也不在代码里手动加载约束,太嗦了,我要么直接修改frame,要么就把约束IBOutlet出来再根据情况修改constant属性,有些布局在design time是不能够决定的,只能在代码里手动做调整,嘿,我研究了几天AutoLayout,算是整明白了,现在感觉AutoLayout确实很好用!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2543 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 11:17 PVG 19:17 LAX 03:17 JFK 06:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86