我注意到与以前版本的iOS相比,iOS 9加载/显示视图的方式发生了变化。这是self.view.frame
iOS 8.4
的输出
viewDidLoad {{0, 0}, {320, 504}}
viewWillAppear {{0, 64}, {320, 504}}
viewDidAppear {{0, 64}, {320, 504}}
iOS 9
viewDidLoad {{0, 0}, {320, 504}}
viewWillAppear {{0, 0}, {320, 504}}
viewDidAppear {{0, 64}, {320, 504}}
请注意,viewWillAppear
方法iOS 9
无法更新origin
的{{1}}。
这会导致我的应用中的某些问题,例如视图最初位置不正确。
有人知道它是否有意或是缺陷?也许快速修复?
答案 0 :(得分:2)
我发现iOS 9与之前的iOS版本相同:在viewWillAppear中,self.view.frame和self.view.bounds仅显示nib中使用的默认大小,而不是运行时实际使用的大小。这意味着,例如,如果您的笔尖的默认宽度为320,但是您在iPhone 6上运行它,则宽度将被错误地报告为320而不是375。
您可以使用[[UIScreen mainScreen]界限],如问题评论中所建议的那样,但这只有在您的观看次数始终填满屏幕时才有效。如果您在iPad上使用分屏设计,并且您需要知道单个视图的实际显示宽度,则它在viewWillAppear中不可用。
您可以使用viewWillLayoutSubviews而不是viewWillAppear,因为在该点正确设置了框架和边界。但是,每次查看时都不会调用此选项,只有在第一次显示时才会调用,因此您的应用行为会略有变化。
我正在使用viewWillAppear和viewWillLayoutSubviews的组合以及一个新的实例变量来复制iOS 9中的iOS 9之前的行为:
@synthesize sizingReady;
- (void)viewDidLoad {
[super viewDidLoad];
// set a flag telling us whether the view size is available
// this is needed in iOS 9 because the view size isn't updated in viewWillAppear yet
self.sizingReady = FALSE;
}
- (void)viewWillAppear:(BOOL)animated {
// don't do anything until the view size is available, which doesn't happen until viewWillLayoutSubviews in iOS 9
if (!self.sizingReady) {
return;
}
[super viewWillAppear:animated];
// your code goes here
}
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
if (!self.sizingReady) {
self.sizingReady = TRUE;
[self viewWillAppear:TRUE];
}
}
答案 1 :(得分:0)
你可以通过swizzling viewWillAppear :,并使用屏幕边界
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.view.frame = [UIScreen mainScreen].bounds;
}
或
- (void)viewDidLoad:(BOOL)animated {
[super viewDidLoad:animated];
self.view.frame = [UIScreen mainScreen].bounds;
}