查看viewWillAppear:和viewDidAppear之间的框架变化:
我在我的应用程序中发现了一个奇怪的行为,其中一个连接的IBOutlet
在我的视图控制器中对viewWillAppear:
和viewDidAppear:
之间的连接视图的框架。 这里是我的UIViewController
子类中的相关代码:
-(void)viewWillAppear:(BOOL)animated { NSLog(@"%@", self.scrollView); } -(void)viewDidAppear:(BOOL)animated { NSLog(@"%@", self.scrollView); }
并生成日志输出:
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}> MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 44; 320 416); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
这清楚地表明,两个电话之间的框架正在改变。 我想在viewDidLoad
方法中使用视图进行设置,但是如果内容不可用于更改,直到它在屏幕上,那么这看起来很没用。 会发生什么?
Autolayout
在我们如何devise和开发我们观点的GUI Autolayout
做出了巨大的改变。 主要区别之一是自动autolayout
不会立即改变我们的视图大小,但是只有当触发时,这意味着在特定的时间,但是我们可以迫使它立即重新计算我们的约束或者将它们标记为布局的“需要” 。 它像-setNeedDisplay
一样-setNeedDisplay
。
对我来说,最大的挑战是理解并接受,我们不再需要使用自动调整的口罩,而框架在提出我们的观点时已经变成无用的属性。 我们不必再去考虑观点的位置,但我们应该考虑如何在一个彼此相关的空间中看到它们。
当我们想混合旧的自动调整掩码和自动布局是出现问题时。 我们应该很快考虑自动布局实现,并尽量避免在基于自动布局的视图层次结构中混合旧的方法。
有一个只使用自动调整掩码的容器视图(比如视图控制器的主视图),但是如果我们不尝试混合,那么更好。
我从来没有使用故事板,但最可以certificate是正确的。 使用Autolayout时,自动布局引擎开始计算时设置您的视图框架。 尝试在你的视图控制器的- (void)viewDidLayoutSubviews
方法的超级之后立即要求相同的事情。
当自动布局引擎完成计算视图的帧时,将调用此方法。
从文档:
viewWillAppear:
通知视图控制器其视图即将被添加到视图层次结构中。
viewDidAppear:
通知视图控制器其视图已添加到视图层次结构中。
因此子视图的框架还没有在viewWillAppear
设置:
在视图呈现给屏幕之前修改你的用户界面的适当方法是:
viewDidLayoutSubviews
通知视图控制器,它的视图只是布局它的子视图。
呼叫
self.scrollView.layoutIfNeeded()
在你的viewWillAppear
方法中。 之后,您可以访问它的框架,它将具有与您在viewDidAppear
打印相同的值
在我的情况下,移动所有框架相关的方法
override func viewWillLayoutSubviews()
完美的工作(我试图修改故事板的约束)。