1

Я использую автозапуск в течение нескольких недель. В настоящее время я использую стороннюю библиотеку FLKAutoLayout, которая упрощает процесс. Я нахожусь в точке, где я могу строить представления так, как я хочу, как правило, без проблем. Тем не менее, за последние 4 дня на работе я боролся с автозапуском, когда задействованы viewcontrollers. Я в порядке со всеми видами UIViews ... но по какой-то причине каждый viewcontroller.view является полным демоном. У меня не было ничего, кроме проблем с получением viewcontroller.view для того, чтобы размер, который я хочу, и когда-либо более глубокая проблема заключается в том, что UIViews дочерних контроллеров просмотра не принимают события должным образом при использовании автозапуска. дочерние контроллеры для просмотра отлично работают при назначении кадров вручную, но все ломается с автозапуском.iOS: Autolayout с контроллерами детского просмотра

Я не понимаю, что так отличается от UIView viewcontroller, что делает его отличным от всех остальных ... Мой ум тает в расстройстве. Является ли ios возиться с представлениями viewcontroller за кулисами или что-то еще?

sample image http://i39.tinypic.com/6qeh3r.png

В изображении, красная область принадлежит к контроллеру зрения ребенка. Эта область не должна проходить мимо нижней части обзора (карта, которая гласит три). Это должно быть легко, и я могу заставить его работать нормально с кучей обычных UIViews, но поскольку это viewcontroller, все ломается ...

Может ли кто-нибудь пролить свет на то, что я не знаю. Любые выводы по потенциальным вопросам очень ценятся.

Спасибо за чтение.

Update: Проблема может быть связана с неоднозначным ограничениями

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]; 

Приведенный выше пример является неоднозначным макет, но я не могу понять, что случилось с ним ...

+0

Вы должны показать код, в который вы добавляете контроллер дочернего представления, и какие ограничения вы пытались добавить. – rdelmar

+0

Есть ли это в прокрутке? – Maarten

+0

На данный момент ничего не видно. Однако в прошлом, когда я пытался использовать прокрутку в автозапуске, все взгляды сжимались, чтобы быть суперкомпактными. Но это еще одна проблема для будущего. – Sethypie

ответ

5

Это должно вероятно, будет комментарий, но комментарии сосут для кода. ;-)


Вы проверили наличие двусмысленных ограничений? Мне кажется, что это мнение может быть вызвано неоднозначными ограничениями.

Добавьте этот код в ваше приложение делегата:

// 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"); 
    } 
} 

и теперь качаете тренажер. Вы найдете жест встряхивания в меню аппаратного обеспечения.

Если он не отображает «Неопределенный автозапуск найден», проверьте наличие неоднозначного элемента (ы) ui в отпечатанной трассе. Они отмечены «AMBIGUOUS».

Затем начните добавлять ограничения, чтобы больше не было двусмысленности.

Вы можете позвонить exerciseAmbiguityInLayout в UI-Element, который имеет неоднозначный макет, чтобы получить подсказку, какие ограничения отсутствуют.


И не забудьте удалить код отладки в свой продукт доставки.Вы можете поместить эти две части внутри #if DEBUG и #endif

+0

Спасибо, Маттиас! Я нашел орду двусмысленных макетов ... что-то вроде отстой, но, по крайней мере, я знаю, что посмотреть сейчас. Я немного не уверен, как определить, какие представления имеют неоднозначные макеты, а что касается ограничений, является неоднозначным. Вы упомянули использование exerciseAmbiguityInLayout, но я не вижу, где эта информация отображается ... ничего не отображается в окне отладки. Я использовал этот метод для нескольких UIView, которые имеют неоднозначные ограничения, но ничего не происходит. – Sethypie

+0

Приобретен для отличной тряски отладки. –

1

В определенный момент в вашем коде вам необходимо добавить контроллер представления ребенка иерархии контроллера представления: [topViewController addChildViewController:childViewController];. И не забудьте добавить -didMoveToParentViewController:.

Это гарантирует, что ваши события поворота и касания будут перенаправлены так, как вы ожидаете.

Что касается проблем с автозапуском: Эрика Садун написала very useful autolayout debugging tools. Я использую его в основном для просмотра viewLayoutDescription, который она написала в категории на UIView, которая печатает очень читаемые списки ограничений, рассказывает о двусмысленности и т. Д. Попробуйте, это действительно помогло мне разобраться, как мои ограничения были перепутались.

Во-вторых: всегда убедитесь, что все ваши взгляды имеют translateAutoresizingMasksIntoConstraints, установленный в NO.