Подтвердить что ты не робот

IOS Autolayout и UIToolbar/UIBarButtonItems

У меня есть просмотр iOS с включенным автозапуском и UIToolbar с UISearchBar и UISegmentControl, содержащимися на панели инструментов. Я хочу, чтобы UISearchBar имела гибкую ширину, поэтому мне нужно добавить ограничение, чтобы заставить это, но из того, что я могу сказать, вы не можете добавлять ограничения к элементам в UIToolbar в Interface Builder. Все параметры отключены.

До AutoLayout я выполнил бы это с помощью autoresizingmasks.

Ограничения не допускаются в пределах UIToolbars/UINavigationBars?

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

4b9b3361

Ответ 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, тем не менее, поэтому ваш пробег меня меняется.