iOS 9更改了视图加载行为

时间:2015-09-24 16:14:26

标签: ios objective-c ios9 viewwillappear

我注意到与以前版本的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}}。

这会导致我的应用中的某些问题,例如视图最初位置不正确。

有人知道它是否有意或是缺陷?也许快速修复?

2 个答案:

答案 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;
}