2014-02-17 7 views
1

Итак, у меня есть UIView, который содержит UIScrollView (и дочерний контентный вид), который имеет под-представления, которые являются сериями UILabels и UIViews, которые растут и сжимаются в зависимости от содержимого, содержащегося в их, используя AutoLayout из раскадровки. Это работает, когда у меня есть что-то вроде Label - Label - Label - Просмотр без каких-либо проблем, однако, если я помещаю пустой UIView между двумя метками и вставляю sub-представления в UIView, я не вижу результатов, которые я ожидая. У меня есть следующий макет в раскадровке:Ограничения Autolayout на пустом UIView не работают должным образом

enter image description here

... где вид чирок и синие ярлыки, которые растут на бесконечную высоту и вид оранжевый (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 волшебным расти и все было бы просто получить помыкать соответственно, однако это это то, что я вижу:

no height uiview

... оранжевый UIView не растет совсем, а два других топ UIView пошли куда-то на экране. Так что моя следующая догадка выключить маски с помощью автоматического изменения ...

optionsPanel.translatesAutoresizingMaskIntoConstraints = NO; 

... но я получаю результат, где все, кажется, работает, но оранжевый UIView (optionsPanel) не имеет высоты для любого причина и выглядит следующим образом:

enter image description here

Это ближе к тому, что я ожидал бы, поэтому я думал, что заставит высоту оранжевый 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 дает следующий результат:

enter image description here

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

+0

Другой хак я обнаружил, что работает, чтобы сделать что-то вроде: NSLayoutConstraint * ограничения = [NSLayoutConstraint constraintWithItem: priceLabel атрибут: NSLayoutAttributeTop relatedBy: NSLayoutRelationEqual toItem: атрибут optionsPanel: NSLayoutAttributeTop множитель: 1 константа: lastTop]; constraint.priority = UILayoutPriorityRequired; [contentView addConstraint: constraint]; где я устанавливаю верхнюю часть метки цены в верхнюю часть панели параметров с константой, которая является высотой панели параметров, которая отталкивает все. Это не идеально, но работает. –

+0

На самом деле это не совсем работает, высота параметровPanel составляет всего ~ 20 пикселей, поэтому другие флажки нечувствительны. –

+0

Вам нужно установить отношения ограничений между панелью опций и его надзорами, чтобы заставить панель параметров расти в соответствии с содержанием. Вы не получите это бесплатно. Когда вы программно добавляете subview, маска автоматического изменения размера по умолчанию - 'UIViewAutoresizingNone', которая, по сути, говорит« сохранить константу кадра », и это связано с ограничениями автоматического макета, не влияет на размер супервизора вообще. –

ответ

2

Как поясняет @Timothy, вам необходимо вручную добавить ограничения в подзоны оранжевого представления, если вы хотите, чтобы он изменялся в зависимости от его содержимого-представлений, не делайте этого по умолчанию.

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

+0

Является ли SizeToFit не предполагаемым, чтобы изменить размер UIView? –

+0

Я на самом деле не уверен, что UIView изменяет размеры, чтобы соответствовать его подзонам (я - парень OS X), но у subviews нет никаких ограничений (и вместо этого есть только кадры) нет ничего, что UIView могло бы использовать. Кадры не учитываются при автоопределении, только ограничения. –

1

Для представлений, созданных в коде, идеально подходит для их кадров, если их translatesAutoresizingMaskIntoConstraints имеет значение YES (по умолчанию, по умолчанию).

Однако для представления, созданного в раскадровке или наконечнике, вы не можете установить translatesAutoresizingMaskIntoConstraints в YES.

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