Добавление представления контроллера представления в качестве подпредставления изменяет его фрейм?

    SomeViewController *someVC = [[SomeViewController alloc] initWithNibName:@"SomeViewController" bundle:nil];
    self.someViewController = someVC;
    [someVC release];


    NSLog(@"height before added as subview: %f", self.someViewController.view.frame.size.height);
    [self.containerView addSubview:self.someViewController.view];
    NSLog(@"height AFTER added as subview: %f", self.someViewController.view.frame.size.height);

    // height before added as subview: 480.000000
    // height AFTER added as subview: 540.000000

Какое возможное объяснение этому? Представление someViewController не имеет никаких установленных свойств автоматического изменения размера, а containerView не автоматически изменяет размер своих подпредставлений. Что может привести к изменению фрейма, просто добавив его в качестве подвида?

Еще одна загадка заключается в том, что это происходит только тогда, когда высота просмотра someViewController >= 480.


person sol    schedule 08.02.2011    source источник
comment
это загадка... что получится, если заменить рамку границами?   -  person jakev    schedule 08.02.2011


Ответы (2)


Какой вид контроллера SomeViewController ? Единственное, что, как я думаю, может произойти, это то, что SomeViewController может содержать дополнительный контент, например, верхнюю панель UINavigationController, которая иногда автоматически увеличивает размер. Но то, что вы делаете, нарушает HIG, добавляя представление одного контроллера представления к другому контроллеру представления. UIViewController предназначен для полного представления экрана или принадлежит специализированному контроллеру представления, такому как UITabBarController, UINavigationController или UISplitViewController. В результате someViewController не будет работать должным образом и не будет принимать такие вызовы, как viewDidLoad. Поэтому, если вы уверены, что никакие свойства автоматического изменения размера не установлены, все, что я могу порекомендовать, это использовать UIView вместо UIViewController.

person Joe    schedule 08.02.2011
comment
Это то, что я в итоге сделал. Но что мешает вызову viewDidLoad в предыдущем сценарии? - person sol; 09.02.2011
comment
Причина, по которой viewDidLoad и другие подобные методы не вызываются, заключается в том, что эти сообщения не будут пересылаться на ваш подчиненный контроллер представления. Apple разработала такие контроллеры, как UINavigationController, для пересылки всех соответствующих сообщений контроллерам представления, поэтому, когда вы пытаетесь добавить только представление контроллера в другое представление, этого больше не происходит. - person Joe; 09.02.2011

Это может быть вызвано autoresizingMask представления, его цель состоит в том, чтобы настроить размер в соответствии с изменениями в его суперпредставлении.

person Guy Ephraim    schedule 08.02.2011