IOS Autolayout и UIToolbar/UIBarButtonItems
У меня есть просмотр iOS с включенным автозапуском и UIToolbar
с UISearchBar
и UISegmentControl
, содержащимися на панели инструментов. Я хочу, чтобы UISearchBar
имела гибкую ширину, поэтому мне нужно добавить ограничение, чтобы заставить это, но из того, что я могу сказать, вы не можете добавлять ограничения к элементам в UIToolbar
в Interface Builder. Все параметры отключены.
До AutoLayout
я выполнил бы это с помощью autoresizingmasks
.
Ограничения не допускаются в пределах UIToolbars/UINavigationBars
?
Как еще это можно сделать при использовании автозапуска?
Ответы
Ответ 1
Ограничения автоопределения работают только с UIViews
и их подклассами.
В то время как UIToolbar
допускает некоторые элементы на основе UIView
(например, UISearchBar
и UISegmentedControl
), они могут сосуществовать с UIBarButtonItems
, которые не наследуются от UIView
.
Пока автозапуск не сможет работать с UIBarButtonItems
, сделайте то, что вы сделали.
Ваша альтернатива - сворачивать вашу собственную панель инструментов с помощью виджетов, основанных только на UIViews
.
Ответ 2
Это также можно сделать прямо из раскадровки.
Просто перетащите элементы на панели инструментов и превратите некоторые из них в гибкое или фиксированное пространство, чтобы получить желаемый эффект. См. Два примера ниже.
![Evenly spaced]()
![Centered]()
NB: это копия моего ответа на выравнивание элементов UIToolBar, я наткнулся на оба вопроса, ища такое решение
Ответ 3
Вы можете сделать это в коде, по крайней мере; Я являюсь типом, чтобы отказаться от интерфейса Builder и в любом случае переходить в код. Кажется, что IB мешает мне чаще, чем когда-либо, когда речь идет о добавлении или настройке ограничений. Вот что я сделал в своем обычном подклассе UIToolbar
-initWithFrame:
.
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self addSubview:self.label];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterX
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterX
multiplier:1 constant:0]];
[self addConstraint:[NSLayoutConstraint
constraintWithItem:self.label
attribute:NSLayoutAttributeCenterY
relatedBy:NSLayoutRelationEqual
toItem:self
attribute:NSLayoutAttributeCenterY
multiplier:1 constant:0]];
}
return self;
}
И так как мне нравится как можно больше ленить нагрузку, здесь меняет переменная экземпляра self.label
(называемая при [self addSubview:self.label]
выше).
- (UILabel *)label {
if (_label) return _label;
_label = [UILabel new];
_label.translatesAutoresizingMaskIntoConstraints = NO;
_label.textAlignment = NSTextAlignmentCenter;
return _label;
}
Кажется, работает для меня. Я не добавляю UIBarButtonItems
, тем не менее, поэтому ваш пробег меня меняется.