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 · 4367 次点击
    这是一个创建于 3442 天前的主题,其中的信息可能已经有所发展或是发生改变。
    今天打算使用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   ·   我们的愿景   ·   实用小工具   ·   2257 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 02:59 · PVG 10:59 · LAX 19:59 · JFK 22:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.