2013-08-09 2 views
2

Я создал подкласс UIView и назвал его MSMobileControlView. Я добавил объект UIView в свою раскадровку с поддержкой Autolayout и присвоил его классу MSMobileControlView.UIView имеет нулевую ширину и высоту, хотя это видно

Внутри MSMobileControlView У меня есть этот код:

-(void)didMoveToSuperview 
{ 
    NSLog(@"self.frame: %@", NSStringFromCGRect(self.frame)); 

    UIBUtton *levelButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [levelButton setFrame:CGRectMake(0, 0, 150, 40)]; 
    [levelButton setTitle:@"Next Level" forState:UIControlStateNormal]; 
    [self addSubview:levelButton]; 
} 

NSLog результат:

self.frame: {{0, 0}, {0, 0}} 

Однако я до сих пор можно увидеть вид на экране и кнопка реагирует на краны, как и ожидалось. У меня нет другого кода, связанного с MSMobileControlView. Что происходит?

ответ

1

Среда выполнения Auto Layout назначает значения кадру позже. Если вы хотите увидеть эти присвоенные значения, введите NSLog в viewDidLayoutSubviews.

Если есть один совет, который я дал бы вам при запуске с автоматическим макетом, это значит, что вы должны забыть о кадрах. Просто работайте с ограничениями. Пусть Auto Layout управляет фреймами от вашего имени, чтобы дать вам макет, который указаны ваши ограничения.

+0

Спасибо за подсказку: да, 'viewDidLayoutSubviews' работает. Есть ли делегат, который выполняется в классе UIView, когда это происходит? –

+1

Нет делегатов. Просто переопределите и вызовите супер, где это необходимо. Убедитесь, что вы установили ограничения в updateConstraints (для представлений) и установите для translatesAutoResizingIntoConstraints значение NO для любых программно созданных представлений –