Что делает контроллер вида для меня, когда ориентация изменилась? - PullRequest
4 голосов
/ 28 января 2010

Простая программа для iphone, сгенерированная шаблоном проекта View-Application, с несколькими кнопками, и я добавил следующий код:

- (void) showInfo: (UIView *) view {
    NSLog(@"view bounds  %6.2f %6.2f %6.2f %6.2f", view.bounds.origin.x, view.bounds.origin.y, view.bounds.size.width, view.bounds.size.height);
    NSLog(@"view frame   %6.2f %6.2f %6.2f %6.2f", view.frame.origin.x, view.frame.origin.y, view.frame.size.width, view.frame.size.height);
    NSLog(@"view center  %6.2f %6.2f", view.center.x, view.center.y);
}

- (BOOL)shouldAutorotateToInterfaceOrientation: UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void)willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrientation duration:(NSTimeInterval) duration {
    switch(toInterfaceOrientation) {
        case UIInterfaceOrientationPortrait:
            [self showInfo: self.view];
            break;
        case UIInterfaceOrientationLandscapeLeft:
            [self showInfo: self.view];
            break;
        case UIInterfaceOrientationLandscapeRight:
            [self showInfo: self.view];
            break;
    }
}

- (void) didRotateFromInterfaceOrientation: (UIInterfaceOrientation) fromInterfaceOrientation {
    switch(fromInterfaceOrientation) {
        case UIInterfaceOrientationPortrait:
            [self showInfo: self.view];
            break;
        case UIInterfaceOrientationLandscapeLeft:
            [self showInfo: self.view];
            break;
        case UIInterfaceOrientationLandscapeRight:
            [self showInfo: self.view];
            break;
    }
}

Запустите симулятор в книжной ориентации, смените пейзаж на правую. Я могу получить:

просмотр границ 0,00 0,00 320,00 460,00
рамка просмотра 0,00 20,00 320,00 460,00
центр просмотра 160.00 250.00
В портретном изображении размер представления составляет 320x460, а его происхождение - (0,20) из-за строки состояния.

просмотр границ 0,00 0,00 480,00 300,00
рамка просмотра 0,00 0,00 300,00 480,00
центр просмотра 150,00 240,00
В альбомной ориентации размер границ изменен на 480x300, однако начало кадра (0, 0). И размер рамки отличается от границ.

Я представляю себе, что эти координаты похожи на следующие картинки:

Portrait

Portrait

Мой вопрос таков: в альбомной ориентации кажется, что источник фрейма указывает на одно местоположение, а источник границ указывает на другое. Поэтому я думаю, что где-то в контроллере представления происходит вращение. Где это и для чего это нужно?

Спасибо за чтение этого длинного и не очень ясного вопроса. :)

1 Ответ

7 голосов
/ 28 января 2010

В альбомном режиме размер содержимого (controller.view) будет изменен и будет применено преобразование на 90 градусов.

Поскольку bounds представляет ограничивающий прямоугольник во внутренней системе координат , bounds.origin всегда будет в верхнем левом углу самого вида.

Однако frame - это ограничивающий прямоугольник во внешней или родительской системе координат. Родителем вашего представления является окно, которое по-прежнему имеет источник в абсолютном верхнем левом углу устройства. Следовательно, ваш frame.origin находится в этой позиции в ландшафтном режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...