Итак, у меня есть UIView, который содержит UIScrollView (и дочерний контентный вид), который имеет под-представления, которые являются сериями UILabels и UIViews, которые растут и сжимаются в зависимости от содержимого, содержащегося в их, используя AutoLayout из раскадровки. Это работает, когда у меня есть что-то вроде Label - Label - Label - Просмотр без каких-либо проблем, однако, если я помещаю пустой UIView между двумя метками и вставляю sub-представления в UIView, я не вижу результатов, которые я ожидая. У меня есть следующий макет в раскадровке:Ограничения Autolayout на пустом UIView не работают должным образом
... где вид чирок и синие ярлыки, которые растут на бесконечную высоту и вид оранжевый (optionsPanel) является пустым UIView, что позже я впрыснуть суб просмотров. Остальная часть материала в окне - элементы управления UILabels и UISegment. Между каждой строкой представлений у меня есть ограничение по Вертикальному пространству с константой 8. Все это прекрасно работало, пока мне не пришлось вставлять пустой UIView и программно вводить вспомогательные представления. Код я ожидал бы работать было бы что-то вроде (optionsPanel является оранжевого цвета UIView) ...
optionsPanel.translatesAutoresizingMaskIntoConstraints = YES;
NSArray *options = [product objectForKey:@"options"];
lastTop = 10;
for(int i=0;i<options.count; i++) {
NSDictionary *option = [options objectAtIndex:i];
NSArray *values = [option objectForKey:@"values"];
if([self hasNoneValue:values] && values.count == 2) {
NSDictionary *value = [self notNoneValue:values];
M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]];
optionCheck.frame = CGRectMake(0, lastTop, 280, 25);
[optionsPanel addSubview:optionCheck];
lastTop += 25;
} else {}
}
... где оранжевый UIView волшебным расти и все было бы просто получить помыкать соответственно, однако это это то, что я вижу:
... оранжевый UIView не растет совсем, а два других топ UIView пошли куда-то на экране. Так что моя следующая догадка выключить маски с помощью автоматического изменения ...
optionsPanel.translatesAutoresizingMaskIntoConstraints = NO;
... но я получаю результат, где все, кажется, работает, но оранжевый UIView (optionsPanel) не имеет высоты для любого причина и выглядит следующим образом:
Это ближе к тому, что я ожидал бы, поэтому я думал, что заставит высоту оранжевый UIView с помощью кода, как ...
frame = optionsPanel.frame;
frame.size.height = lastTop;
optionsPanel.frame = frame;
... но это ни к чему не скажется.
Чисто догадываясь, я обнаружил, что этот код работает почти, если произвольное множество происхождения optionPanel на нечто гораздо большее, чем пространство, которое необходимо ....
optionsPanel.translatesAutoresizingMaskIntoConstraints = YES;
NSArray *options = [product objectForKey:@"options"];
lastTop = 10;
for(int i=0;i<options.count; i++) {
NSDictionary *option = [options objectAtIndex:i];
NSArray *values = [option objectForKey:@"values"];
if([self hasNoneValue:values] && values.count == 2) {
NSDictionary *value = [self notNoneValue:values];
M13Checkbox *optionCheck = [[M13Checkbox alloc] initWithTitle:[option objectForKey:@"name"]];
optionCheck.frame = CGRectMake(0, lastTop, 280, 25);
[optionsPanel addSubview:optionCheck];
lastTop += 25;
} else {}
}
lastTop += 10;
frame = optionsPanel.frame;
frame.size.height = lastTop;
frame.origin.y += 300; //some arbitrarily large number
optionsPanel.frame = frame;
..which дает следующий результат:
... но, видимо, AutoLayout решил, что на этикетке имя должно занимать дополнительное место. Это уродливый подход, но если бы я мог понять, сколько места мне нужно, я мог бы просто сбить все, если бы пришлось. В чем секрет того, чтобы иметь динамический UIView между двумя ярлыками с динамическим размером, и все просто работает?
Другой хак я обнаружил, что работает, чтобы сделать что-то вроде: NSLayoutConstraint * ограничения = [NSLayoutConstraint constraintWithItem: priceLabel атрибут: NSLayoutAttributeTop relatedBy: NSLayoutRelationEqual toItem: атрибут optionsPanel: NSLayoutAttributeTop множитель: 1 константа: lastTop]; constraint.priority = UILayoutPriorityRequired; [contentView addConstraint: constraint]; где я устанавливаю верхнюю часть метки цены в верхнюю часть панели параметров с константой, которая является высотой панели параметров, которая отталкивает все. Это не идеально, но работает. –
На самом деле это не совсем работает, высота параметровPanel составляет всего ~ 20 пикселей, поэтому другие флажки нечувствительны. –
Вам нужно установить отношения ограничений между панелью опций и его надзорами, чтобы заставить панель параметров расти в соответствии с содержанием. Вы не получите это бесплатно. Когда вы программно добавляете subview, маска автоматического изменения размера по умолчанию - 'UIViewAutoresizingNone', которая, по сути, говорит« сохранить константу кадра », и это связано с ограничениями автоматического макета, не влияет на размер супервизора вообще. –