2010-01-28 2 views
4

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

- (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

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

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

+0

В документе apple, Руководство по программированию контроллера для iOS в разделе Реагирование на изменения ориентации в одном шаге: # Окно регулирует границы вида контроллера вида. Это приводит к изменению размера каждого вида в иерархии представлений на основе его маски авторезистировки. – yehnan

ответ

7

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

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

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

+0

Спасибо. Где изменение размера и преобразование 90-dgree happpen? В контроллере? – yehnan

+0

@yehnan: В некоторых процедурах, которые никогда не будут документированы в 'UIWindow'. – kennytm

+2

Это было гораздо лучшее резюме фреймов и границ, чем предлагалось в документации собственного класса Apple. Я не понимал, почему высота и ширина рамки не были связаны с ориентацией устройства, пока я не прочитал сообщение KennyTM. (И в результате я узнал, что я хочу, как правило, придерживаться подсмотров в отношении границ, в отличие от фрейма их родителя.) –

Смежные вопросы