2015-10-07 1 views
37

У меня есть простой горизонтальный UIStackView с несколькими UIViews, уложенными внутри. Моя цель - создать переменный интервал между представлениями. Мне хорошо известно, что я могу создать постоянное пространство между подзонами, используя свойство «spacing». Однако моя цель - создать переменное пространство. Пожалуйста, обратите внимание: если это вообще возможно, я бы хотел избежать использования невидимых представлений, которые действуют как проставки.Как создать UIStackView с переменным расстоянием между представлениями?

Лучшее, что я придумал, заключалось в том, чтобы обернуть мои UIViews в отдельный UIStackView и использовать layoutMarginsRelativeArrangement = YES, чтобы уважать макеты макета моего внутреннего стека. Я надеялся, что смогу сделать что-то подобное с любым UIView, не прибегая к этой уродливой работе. Вот мой пример код:

// Create stack view 
UIStackView *stackView = [[UIStackView alloc] init]; 
stackView.translatesAutoresizingMaskIntoConstraints = NO; 
stackView.axis = UILayoutConstraintAxisHorizontal; 
stackView.alignment = UIStackViewAlignmentCenter; 
stackView.layoutMarginsRelativeArrangement = YES; 

// Create subview 
UIView *view1 = [[UIView alloc] init]; 
view1.translatesAutoresizingMaskIntoConstraints = NO; 
// ... Add Auto Layout constraints for height/width 
// ... 
// I was hoping the layoutMargins would be respected, but they are not 
view1.layoutMargins = UIEdgeInsetsMake(0, 25, 0, 0); 

// ... Create more subviews 
// UIView view2 = [[UIView alloc] init]; 
// ... 

// Stack the subviews 
[stackView addArrangedSubview:view1]; 
[stackView addArrangedSubview:view2]; 

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

enter image description here

ответ

46

обновление для прошивки 11, StackViews с клиентами Spacing

Apple добавила возможность устанавливать пользовательский интервал в iOS 11. Вам просто нужно указать интервал после каждого упорядоченного подсмотра. К сожалению, вы не можете указать интервал раньше.

stackView.setCustomSpacing(10.0, after: firstLabel) 
stackView.setCustomSpacing(10.0, after: secondLabel) 

Still way better than using Ваши собственные взгляды.

Для прошивки 10 и ниже

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

(Label - UIView - Этикетка - UIView-Label)

и если вы держите distribution для заполнения, то вы можете настроить переменные ограничения ширины на ваших UIViews.

Но я бы подумал, если это подходящая ситуация для использования stackviews, если это так. Autolayout упрощает настройку переменной ширины между представлениями.

+2

Спасибо, но я надеялся, что мне не нужно прибегать к пустым представлениям, чтобы добавить место или вернуться к автомаке. Хотя, если UIStackView не поддерживает мой прецедент, мне все равно может понадобиться. – yura

+1

Почему вы хотите, чтобы интервал был переменным? Вы можете иметь переменный интервал, если вы используете «распределение» равное центрирование. Это сделает центры равными ширинами друг от друга, но расстояние будет меняться. Объясните больше о вашем случае использования. –

+0

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