Почему мои представления не корректно позиционируются при изменениях interfaceOrientation? - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть UIViewController один UIWebView в нем.Мне бы хотелось, чтобы UIWebView располагался в центре экрана iPad в альбомном и портретном режимах.Итак, я реализовал это так:

// UIViewController
// InfoGraphicView is the UIWebView

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Overriden to allow any orientation.
    return YES;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 
                                duration:(NSTimeInterval)duration {
    if (toInterfaceOrientation == UIInterfaceOrientationPortrait ||
        toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        [self layoutPortrait];
    } else {
        [self layoutLandscape];
    }
}

- (void)layoutLandscape {
    NSLog(@"Layout Landscape");
    infoGraphicView.frame = CGRectMake(100, 100, 936, 700);
}

- (void)layoutPortrait {
    NSLog(@"Layout Portrait");
    infoGraphicView.frame = CGRectMake(100, 100, 700, 936);
}

Однако, это не так, как я ожидал.В приведенном выше коде я ожидал бы, что он UIWebView будет 100px (или точки, или что-то еще, что единица измерения) от верха и слева.Но это не так.В портретном режиме он отображается заподлицо с верхним левым краем экрана, а в альбомном режиме в левом верхнем углу он выглядит частично за кадром.

Если я установлю рамку как CGRectMake(-100, 100, 700, 936), тогда я получу ее в центре экрана, как мне хотелось бы, но я понятия не имею, почему.

Как обычно, скорее всего, я что-то упускаю из виду, но не могу понять.Любая помощь с благодарностью, как всегда.

Ответы [ 2 ]

1 голос
/ 10 декабря 2010

Координаты, которые вы устанавливаете в infoGraphicView, относятся к его суперпредставлению, а не к экрану в целом. И представления не обязательно обрезать их подпредставления. Кроме того, форма, автоматически установленная в self.view, будет зависеть от флагов масштабирования, установленных в Интерфейсном Разработчике. Тем не менее, я думаю, что по умолчанию он заполнен на весь экран.

Тем не менее, я думаю, что ошибка в том, что вы используете willRotateToInterfaceOrientation: duration :. Это вызывается до начала вращения, поэтому self.view имеет старый размер (т. Е. Он все равно будет иметь портретный размер при повороте из портретного в ландшафтный и наоборот). Возможно, лучше перехватить willAnimateRotationToInterfaceOrientation: duration: - тогда будет задан правильный размер, и вы окажетесь в блоке CoreAnimation, поэтому ваш вид будет увеличиваться / уменьшаться в рамках анимации вращения.

Также стоит проверить, какие флаги изменения размера вы установили в infoGraphicView. Они вступят в силу автоматически, в дополнение к любым изменениям, которые вы делаете. Так что вы, вероятно, хотите отключить их все.

1 голос
/ 10 декабря 2010

Это, вероятно, проблема с представлением, в котором находится веб-представление. Используемая система координат - это система суперпредставления представления. Если размер этого вида не изменяется при вращении, вы увидите неожиданный макет, подобный этому. Вы можете получить доступ к суперпредставлению вида через свойство superview; Один из способов увидеть его рамку - использовать его описание. Поместите эту строку в один из ваших методов размещения:

NSLog(@"Superview: %@", [infoGraphicView superview]);

Это должно распечатать описание вида.

Как только вы выясните это, если вы хотите, чтобы веб-представление имело тот же макет, вы можете использовать его свойство autoresizingMask. Если вы установите его так:

infoGraphicView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

Тогда вид автоматически изменит свою ширину и высоту, чтобы верхний, левый, правый и нижний поля были одинаковыми.

...