gpt4 book ai didi

iOS 9 改变了 View 加载行为

转载 作者:可可西里 更新时间:2023-11-01 03:57:54 26 4
gpt4 key购买 nike

与之前的 iOS 版本相比,我注意到 iOS 9 加载/显示 View 的方式发生了变化。这是 iOS 8.4

self.view.frame 的输出
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 无法更新 self.view.frameorigin

这会导致我的应用出现某些问题,例如 View 最初的位置不正确。

有谁知道这是故意的还是缺陷?也许是快速修复?

最佳答案

我发现 iOS 9 与之前的 iOS 版本有相同的变化:在 viewWillAppear 中,self.view.frame 和 self.view.bounds 只显示 nib 中使用的默认大小,而不是运行时实际使用的大小。这意味着,例如,如果您的 Nib 的默认宽度为 320,但您在 iPhone 6 上运行它,则该宽度将被错误地报告为 320 而不是 375。

您可以使用 [[UIScreen mainScreen] bounds],如问题评论中所建议的那样,但这只有在您的 View 始终填满屏幕时才有效。如果您在 iPad 上进行了分屏设计并且您需要知道单个 View 的实际显示宽度,则在 viewWillAppear 中不可用。

您可以使用 viewWillLayoutSubviews 而不是 viewWillAppear,因为此时框架和边界已正确设置。但是,不会在每次 View 出现时调用它,仅在它首次出现时调用,因此您的应用行为会略有变化。

我结合使用了 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];
}
}

关于iOS 9 改变了 View 加载行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766214/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com