2014-09-11 5 views
10

У меня проблемы с ограничениями в VFL на iOS 8, а на 6 и 7 все в порядке. Это ограничение:Автозапуск iOS 8, VFL и маржа равны или больше

H:|-margin-[_imageView]-(=>margin)-[_label]-margin-| 

Оба _imageView_ и _label получают правильную внутреннюю ширину, а маржа растет, как и ожидалось. Я хочу, чтобы достичь

|-[_imageView]-------------------------------[some text]-| 

|-[_imageView]---------------------------[a larger text]-| 

|-[_imageView]-----------------------[a very large text]-| 

|-[_imageView]-[a very very very very very very larg...]-| 

Это нормально визуально, но это вызывает сломанное исключение ограничения:

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7b856ee0 H:[UIImageView:0x7b8ef1f0]-(>=12)-[UILabel:0x7b8e7c60'Test']> 

Там нет никакой двусмысленности после печати _autolayoutTrace.

Однако, если ограничение связанно не маркирует только там не проблема:

H:|-margin-[_label1]-(=>margin)-[_label2]-margin-| 

Проблема может быть решена, следуя следующие шаги:

Изменения ограничения извлекая >= и добавляющих приоритеты:

H:|-margin-[_imageView]-([email protected])-[_label]-margin-| 

Установка приоритета обнимать в _imageView

[_imageView setContentHuggingPriority:UILayoutPriorityDefaultHigh forAxis:UILayoutConstraintAxisHorizontal]; 

Установка сопротивления компрессионного _label

[_label setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; 

С помощью этих правил не существует никаких проблем, на любой платформе. Все это необходимо на iOS 8? Это ошибка, или я делал это неправильно?

Спасибо.

+0

Моя догадка заключается в том, что сломанное ограничение происходит из-за слишком длинной текстовой строки, чтобы почтить "> = 12"; то есть ширина полей + изображение + текст превышает ширину родительского представления. Это правда, что iOS 8 вводит макеты макета, но я не знаю достаточно о том, как это повлияет на заявления VFL для какой-либо помощи.Можете ли вы установить высоту линии вашего ярлыка равным 0, чтобы она могла расширяться вертикально и по-прежнему сохранять горизонтальное ограничение? – NRitH

+0

@NRitH ограничение прерывается всегда, независимо от длины текста. Я не могу изменить количество строк метки, текст должен быть усечен. – emenegro

+0

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

ответ

5

Я начал проект с нуля, и вот мой код (который на самом деле работает отлично):

UIView *topView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 200)]; 
topView.backgroundColor = [UIColor redColor]; 
topView.translatesAutoresizingMaskIntoConstraints = NO; 

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 20, 40, 160)]; 
imageView.backgroundColor = [UIColor greenColor]; 
imageView.translatesAutoresizingMaskIntoConstraints = NO; 
[topView addSubview:imageView]; 

self.label = [[UILabel alloc] initWithFrame:CGRectMake(80, 80, 200, 32)]; 
self.label.backgroundColor = [UIColor yellowColor]; 
self.label.text = @"some text"; 
self.label.translatesAutoresizingMaskIntoConstraints = NO; 
[topView addSubview:self.label]; 


self.tableView.tableHeaderView = topView; 

NSDictionary *views = @{@"imageView":imageView, @"label":self.label}; 

NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-margin-[imageView(40)]-(>=margin)-[label]-margin-|" options:0 metrics:@{@"margin": @30} views:views]; 
NSArray *imageConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[imageView(160)]-20-|" options:0 metrics:nil views:views]; 
NSArray *textConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-40-[label]" options:0 metrics:nil views:views]; 
NSArray *topConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[topView(320)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(topView)]; 

[topView addConstraints:constraints]; 
[topView addConstraints:imageConstraints]; 
[topView addConstraints:textConstraints]; 
[topView addConstraints:topConstraints]; 

Я думаю, что ваша главная проблема в том, что вы не выключаете translatesAutoresizingMaskIntoConstraints, который производит UIView-Encapsulated-Layout (который я никогда не встречался до iOs8). Я не нашел места, где он хорошо документирован, но есть ряд вопросов относительно этого ограничения.

Я также создал GitHub репо, так что вы можете попробовать это сами: https://github.com/Nikita2k/constraintsTest

Кроме того, вы посмотрите на WWDC2014 видео можно - Что нового в таблице и коллекция Просмотров (~ 20мин). Есть информация, что вы можете увидеть проблему UIView-Encapsulated-Layout, но она будет исправлена ​​позже. Кроме того, вы можете попробовать играть с rowHeight как все ios8 tableViews из раскадровки (или XIB) должны явно установить

self.tableView.rowHeight = UITableViewAutomaticDimension 

Я не уверен, что это поможет в этом случае particullar или нет, но дать ему попробовать тоже !

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