如果用 xib 或者 storyboard 界面布局,我要怎样在代码里获取 view 的 frame - 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
cheng4741
V2EX    iDev

如果用 xib 或者 storyboard 界面布局,我要怎样在代码里获取 view 的 frame

  •  
  •   cheng4741
    zhubinchen 2015-05-22 15:40:28 +08:00 4517 次点击
    这是一个创建于 3819 天前的主题,其中的信息可能已经有所发展或是发生改变。
    15 条回复    2015-08-13 13:35:41 +08:00
    xhacker
        1
    xhacker  
       2015-05-22 15:47:22 +08:00 via iPhone   1
    就 view.frame 就行。
    cheng4741
        2
    cheng4741  
    OP
       2015-05-22 16:14:02 +08:00
    @xhacker 额,我好像没说清楚,我的意思是view.frame在自动布局的情况下根本不适用。
    babyname
        3
    babyname  
       2015-05-22 16:14:43 +08:00
    @cheng4741 为什么不适用,怎么得出的结论。
    newtonisaac
        4
    newtonisaac  
       2015-05-22 16:15:23 +08:00
    代码哪里?是已经生成了view还是之前?
    nomemo
        5
    nomemo  
       2015-05-22 16:18:00 +08:00
    @cheng4741 根据约束条件取
    cheng4741
        6
    cheng4741  
    OP
       2015-05-22 16:21:53 +08:00
    @babyname 你试一下你就知道了,view.frame得到的是在xib上的大小,而不是运行时的实际大小
    cheng4741
        7
    cheng4741  
    OP
       2015-05-22 16:22:40 +08:00
    @newtonisaac 已经生成了,现在我要给这 view添加一个layer,需要知道它的大小
    cheng4741
        8
    cheng4741  
    OP
       2015-05-22 16:24:11 +08:00
    @nomemo 你的意思是让我根据条件和屏幕大小算吗?我以前是这么做,但是觉得太罗嗦。
    black
        9
    black  
       2015-05-22 18:04:56 +08:00   2
    这是 iOS 开发的老"坑"了,原因是对 view controller 的生命周期理解不够。

    我给两个方案给你:

    1. 把代码放到 -(void)viewDidLayoutSubviews 里去吧,你会发现这时 view controller 的 view 大小已经调整好了,但是 [千万要注意!] 这个方法会调用多次。

    2. 仍然放在 -(void)viewDidLoad,如下:

    - (void)viewDidLoad
    {
    ...
    dispatch_async(dispatch_get_main_queue(), ^{
    // your code
    });
    }
    dorentus
        10
    dorentus  
       2015-05-22 18:16:47 +08:00
    viewWillAppear 里面的 frame 也应该是正确的了,不过也会有被多次调用的问题

    你这种情况也可以 subclass UIView,然后在 layoutSubviews 里面处理 frame 的变化吧
    langhua9527
        11
    langhua9527  
       2015-05-22 18:19:18 +08:00
    自动布局为什么要取frame?
    yoki
        12
    yoki  
       2015-05-25 15:06:15 +08:00   1
    你好 之前也遇到过这样的问题 来说一下我的解决办法

    自动布局是会在更新视图的时候同步更新frame bounds的 然而有时候我们在代码中获取的时候却得到{(0,0),(0,0)} 或者各种奇怪的结果 这是因为在你用代码获取frame的时候系统还没有更新你的layout

    楼上的朋友@dorentus 提供的解决方案应该是可行的 因为在viewWillAppear中一般的视图都更新完layout了 应该是可以获取到的

    但是有时候我们想在任意函数中获取怎么办呢

    解决方案是在获取之前加上一句[myDemoView layoutIfNeeded];



    ```
    [myDemoView layoutIfNeeded];

    NSLog("frame:%@",NSStringFromRect(myDemoView.frame));
    ```

    这个回复是我在PC上打的 拼写也许有错误 希望能帮到你
    cheng4741
        13
    cheng4741  
    OP
       2015-06-01 11:03:41 +08:00
    @yoki 谢谢,被这个困惑好久了,终于明白了
    cheng4741
        14
    cheng4741  
    OP
       2015-06-01 11:04:31 +08:00
    @black 学习了
    yh4801480
        15
    yh4801480  
       2015-08-13 13:35:41 +08:00
    @cheng4741 牛逼啊
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5442 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 06:40 PVG 14:40 LAX 22:40 JFK 01:40
    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