Почему мои подпредставления не центрируются правильно в зависимости от ориентации устройства? - PullRequest
5 голосов
/ 25 марта 2011

Я пытаюсь программно создать собственный контроллер представления с подпредставлениями, которые находятся в центре экрана. Я преуспел, и когда я перехожу к этому виду, центрированный вид появляется в центре и вращается правильно, когда вы поворачиваете устройство.

Но в этом навигационном приложении, если я вхожу в пользовательский вид, когда не в портретном режиме, то вид, который должен быть центрирован, позиционирует себя в месте, которое не является центром экран. Я поместил все необходимые свойства авторазмера в представлениях, контроллере, родителе, бабушке, святой девственнице ... и у меня закончились вещи, чтобы прикрепить маску авторазмера, и все же пример выглядит плохо.

Я уверен, что мне не хватает вызова какого-то магического метода, который все исправит, но я не понял, что и куда вызывать (setNeedsDisplay? SetNeedsLayout?). Чтобы продемонстрировать эту проблему, я создал полный пример, доступный по адресу https://github.com/gradha/iPhone-centered-rotation-test, который вы можете клонировать и запустить в симуляторе или устройстве. Я создал это из навигационного контроллера Apple, просто добавив поддельную ячейку, которая выдвигает вид, который я создаю вручную.

Пользовательское представление можно найти по адресу https://github.com/gradha/iPhone-centered-rotation-test/blob/master/Classes/CenteredViewController.m, а вот метод loadView, отвечающий за создание центрированных подпредставлений:

/* Try to force the parent view to be as we want it. */
self.view.backgroundColor = [UIColor yellowColor];
self.view.autoresizesSubviews = YES;
self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight |
    UIViewAutoresizingFlexibleWidth;

/* Top left blue square, for reference. */
blue_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 130, 130)];
[self.view addSubview:blue_];
blue_.backgroundColor = [UIColor blueColor];
[blue_ release];

/* Create red centered rectangle. */
red_ = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
red_.backgroundColor = [UIColor redColor];
red_.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin |
    UIViewAutoresizingFlexibleTopMargin |
    UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;
red_.center = self.view.center;
[self.view addSubview:red_];
[red_ release];

Вот ссылка на пошаговое руководство для захвата экрана приложения , сначала войдите в портретный режим и поверните экран (работает нормально), затем войдите в альбомный режим и поверните (в зависимости от того, с какой стороны вращения он выглядит довольно плохо). Когда вы входите в вид в ландшафтном режиме, в зависимости от ориентации красный квадрат будет иметь верхний левый угол 196x34 или 140x34, что слишком большая разница.

Чего мне не хватает, чтобы правильно настроить эти подпредставления при входе в вид в альбомной ориентации и выполнить автоматический поворот?

1 Ответ

8 голосов
/ 25 марта 2011

Похоже, что в одной из альбомных ориентаций, в loadView, начало координат вида контроллера установлено на (0, 20), что сбивает с толку поворот и автоматическое изменение размера, которое происходит после добавления вида на экран.Как ни странно, это (0, 0) во всех других ориентациях.

Чтобы исправить проблему, добавьте эту строку после [super loadView]:

self.view.frame = self.view.bounds;

Для уточнения: так как источник кадране в (0, 0), понятие self.view.center неверно в контексте, в котором оно используется.Свойство center является центром этого представления, видимого в его суперпредставлении.То, что вам действительно нужно, это центр вида bounds.

. Сбрасывая рамку вида до границ вида, вы фактически изменяете исходную точку обратно на (0, 0), и можно использовать center.должным образом.

...