2015-09-24 3 views
5

Я заметил изменение в том, как iOS 9 загружает/отображает представления по сравнению с предыдущими версиями iOS. Вот выход self.view.frame в iOS 8.4iOS 9 изменено поведение загрузки изображения

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 из self.view.frame.

Это вызывает определенные проблемы в моем приложении, так как представления изначально были неверными.

Кто-нибудь знает, если это предназначено или это дефект? И, возможно, быстро исправить?

+0

Почему это изменение будет проблемой для вас ? Subviews должны располагаться на основе ограничений, а не фреймов, их родительского представления. Это не будет иначе. – rmaddy

+0

Хорошая точка, только я обрабатываю позицию 'UITabBar' (показывая на некоторых экранах, скрываясь в других), что не является подзадачей' self.view'. Кроме того, «iOS 9» не может обновить размер представления, а также источник. – artooras

+0

Вывод, который вы показываете, указывает, что размер вида обновлен. Это 504 в обеих версиях iOS. – rmaddy

ответ

1

Я нашел то же самое изменение в 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 в прошивке 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]; 
    } 
} 
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; 
} 

 
Смежные вопросы