Как создать UIStackView с переменным расстоянием между представлениями?

у меня есть простой горизонтальный UIStackView с несколькими uiviews, уложенными внутри. Моя цель-создать переменный интервал между представлениями. Я хорошо знаю, что могу создать постоянное пространство между подвидами, используя свойство "spacing". Однако моя цель-создать переменное пространство. Обратите внимание, если это возможно, я хотел бы избежать использования невидимых видов, которые действуют как распорки.

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

1 ответов


обновление для iOS 11, StackViews с пользовательским интервалом

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

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

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

для iOS 10 и ниже

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

(Метка - UIView - Метка - UIView-Метка)

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

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