Почему высота и ширина self.view отличаются от высоты и ширины sub view?
Какова логика того факта, что главный экран и self.view всегда поддерживают одинаковые размеры ширины и высоты независимо от ориентации (даже если self.view корректно изменяет размер в соответствии с текущей ориентацией устройства), а вспомогательный вид из self.view возвращает измененные размеры по ширине и высоте при изменении ориентации устройства?
NSLog(@"screen bounds w: %f, h: %f", [[UIScreen mainScreen] bounds].size.width,[[UIScreen mainScreen] bounds].size.height );
NSLog(@"self.view frame w: %f, h: %f", self.view.frame.size.width, self.view.frame.size.height );
NSLog(@"myView frame w: %f, h: %f", _myView.frame.size.width, _myView.frame.size.height );
Журнал вывода портрета
2012-11-05 16:15:11.152 test[2807:11303] screen bounds w: 320.000000, h: 480.000000
2012-11-05 16:15:11.153 test[2807:11303] self.view frame w: 320.000000, h: 460.000000
2012-11-05 16:15:11.153 test[2807:11303] myView frame w: 320.000000, h: 460.000000
Выходной ландшафт журнала
2012-11-05 16:14:38.800 test[2807:11303] screen bounds w: 320.000000, h: 480.000000
2012-11-05 16:14:38.801 test[2807:11303] self.view frame w: 300.000000, h: 480.000000
2012-11-05 16:14:38.801 test[2807:11303] myView frame w: 480.000000, h: 300.000000
3 ответа
На самом деле это больше, чем маски с автоматическим изменением размера. Поэтому при изменении ориентации устройства физические характеристики экрана остаются прежними. Если вы установите автоматический поворот вида, ширина и высота будут переведены для вас. Таким образом, когда просят размеры экрана с переведенными видами, его черт. для вас, чтобы сделать расчеты на основе self.view.center
или же self.view.bounds
а не на self.view.frame
,
[UIScreen mainScreen]
всегда 320w
а также 480h
(568h
для iPhone5) для iPhone.
Размеры [UIScreen mainScreen]
берется для портретной ориентации.
Строка состояния устройства отображается в вашем приложении согласно вашему NSLog
"S. Благодаря этому у вас есть 300h
в ландшафте и 460h
в портрете.
Это зависит от того, какое свойство autoSizingMask установлено для ваших подпредставлений.
Я предполагаю, что вы не используете функцию AutoLayout в iOS 6.0. Если вы это сделаете, то вам нужно больше взглянуть на настройки ограничений в iOS 6.0.
По умолчанию маска автоматического изменения размера вашего вида "Scale to Fill", см. Прикрепленное изображение. Вы можете установить то же самое для ваших подпредставлений на основе ваших требований. Подробнее о Struts и Springs смотрите в документации Apple.
Если авторазмер не соответствует вашим требованиям, вам нужно будет реализовать свои собственные методы, чтобы компоновать ваши представления по измененной ориентации. Что-то вроде ниже;
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView animateWithDuration:duration animations:^{
[self layoutForOrientation:toInterfaceOrientation];
}];
}
#pragma mark - Layout views
- (void)layoutForOrientation:(UIInterfaceOrientation)orientation {
if (UIInterfaceOrientationIsPortrait(orientation))
[self layoutPortraitViews];
else
[self layoutLandscapViews];
}
- (void)layoutLandscapViews {
// Layout your landscape views
}
- (void)layoutPortraitViews {
// Layout your portrait views
}