【发布时间】:2013-07-12 07:56:15
【问题描述】:
我在我的应用程序中发现了一个奇怪的行为,其中连接的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 方法中的视图进行设置,但是如果内容在屏幕上之前我无法更改,那似乎毫无用处。会发生什么?
【问题讨论】:
-
你在使用自动布局吗?您是在界面生成器中添加此视图还是以编程方式添加此视图?
-
自动布局已启用,此视图是在 IB 中从故事板创建的。
-
我从未使用过故事板,但很可能它是正确的。使用自动布局引擎在自动布局引擎开始计算时设置视图的自动布局框架。尝试在视图控制器的 - (void)viewDidLayoutSubviews 方法的 super 之后立即询问相同的问题。
-
这会在正确的时间成功触发我的事件,但是每当我在视图上执行任何动画时也会调用该方法。
-
viewDidLayoutSubviews是正确的方法。我只需将所有内容放在子视图中,这样每当我更改主视图的框架时就不会重新调用该方法。
标签: iphone ios objective-c uiscrollview