Почему высота и ширина 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
}

маска автоматического изменения размера по умолчанию для основного вида

Другие вопросы по тегам