iOS: Autolayout с дочерними контроллерами представления
Я пользуюсь autolayout уже пару недель. В настоящее время я использую стороннюю библиотеку под названием FLKAutoLayout, которая облегчает процесс. Я нахожусь в точке, где я могу строить представления так, как я хочу, обычно без проблем. Тем не менее, в течение последних 4 дней на работе я боролся с автоматической разметкой, когда задействованы viewcontrollers. Я в порядке со всеми видами UIViews... но по какой-то причине каждый viewcontroller.view является полным демоном. У меня не было ничего, кроме проблем с получением viewcontroller.view нужного размера, и еще более серьезная проблема заключается в том, что UIViews дочерних viewcontrollers не получают события правильно при использовании autolayout. дочерние viewcontrollers работают просто отлично при назначении фреймов вручную, но все нарушается с помощью автоматического размещения.
Я не понимаю, что же такого особенного в UIView viewcontroller, что делает его отличным от всех остальных... Мой разум тает от разочарования. IOS портит мои представления viewcontroller за кулисами или что-то в этом роде?
http://i39.tinypic.com/6qeh3r.png
На изображении красная область принадлежит дочернему контроллеру представления. Эта область не должна проходить мимо самого нижнего подпредставления (карта с надписью три). Это должно быть легко, и я могу заставить его нормально работать с кучей обычных UIViews, но поскольку это viewcontroller, все ломается...
Может кто-нибудь пролить свет на то, что это я не знаю. Любые выводы о потенциальных проблемах высоко ценится.
Спасибо за прочтение.
Обновление: проблема может быть связана с неоднозначными ограничениями
UIView *box = [[UIView alloc]init];
[box addSubview:imageView];
[box addSubview:nameLabel];
imageView constrainWidth:@"32" height:@"32"];
[imageView alignTop:@">=0" leading:@"0" bottom:@"<=0" trailing:@"<=0" toView:box];
[imageView alignCenterYWithView:box predicate:@"0"];
[nameLabel constrainLeadingSpaceToView:imageView predicate:@"5"];
[nameLabel alignTop:@">=0" leading:@">=0" bottom:@"<=0" trailing:@"<=0" toView:box];
[nameLabel alignCenterYWithView:box predicate:@"0"];
[self addSubview:box];
[box alignTop:@"5" leading:@"5" bottom:@"-5" trailing:@"-5" toView:self];
Приведенный выше пример является неоднозначным, но я не могу понять, что с ним не так...
2 ответа
Вероятно, это должен быть комментарий, но комментарии отстой для кода.;-)
Вы проверяли наличие неоднозначных ограничений? На мой взгляд, это мнение может быть вызвано неоднозначными ограничениями.
Добавьте этот код вашему делегату приложения:
// before @implementation AppDelegate
@interface UIWindow (AutoLayoutDebug)
+ (UIWindow *)keyWindow;
- (NSString *)_autolayoutTrace;
@end
// inside of @implementation
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event {
NSString *autolayoutTrace = [[UIWindow keyWindow] _autolayoutTrace];
if ([autolayoutTrace rangeOfString:@"AMBIGUOUS"].location != NSNotFound) {
NSLog(@"%@", autolayoutTrace);
}
else {
NSLog(@"No Ambiguous autolayout found");
}
}
а теперь качай свой симулятор. Вы найдете жест встряхивания в аппаратном меню.
Если он не показывает "Не найдена неоднозначная автопоставка", проверьте наличие неоднозначных элементов пользовательского интерфейса в напечатанной трассировке. Они помечены как "СЕРЬЕЗНЫЕ".
Затем начните добавлять ограничения, чтобы не было больше двусмысленности.
Ты можешь позвонить exerciseAmbiguityInLayout
на элементе пользовательского интерфейса, который имеет неоднозначную компоновку, чтобы получить подсказку, какие ограничения отсутствуют.
И обязательно удалите код отладки в вашем продукте доставки. Вы могли бы поместить эти две части внутри #if DEBUG
а также #endif
В определенный момент в вашем коде вам нужно добавить дочерний контроллер представления в иерархию контроллера представления: [topViewController addChildViewController:childViewController];
, И не забудьте добавить -didMoveToParentViewController:
после этого.
Это гарантирует, что ваши события поворота и касания будут перенаправлены так, как вы ожидаете.
Что касается ваших проблем с автоматическим размещением: Эрика Садун написала несколько очень полезных инструментов отладки автоматического размещения. Я использую это в основном, чтобы посмотреть на viewLayoutDescription
что она написала в категории на UIView, которая печатает очень читаемые списки ограничений, говорит вам о неоднозначности и т. д. Попробуйте, это действительно помогло мне понять, как мои ограничения были испорчены.
Во-вторых: всегда убедитесь, что все ваши взгляды имеют translateAutoresizingMasksIntoConstraints
установлен в NO
,