2013-02-20 2 views
21

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

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

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

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

+0

я сделал некоторые вещи, как это раньше, хотя я в основном просто жду изменения размера представления, а затем соответствующим образом обновляю рамку целевого представления. Это всегда вариант, если, оказывается, нет способа сделать это автоматически. – Brian

+0

Вы не могли бы разместить изображение? –

+0

Я бы хотел, но я закончил тем, что отказался от AutoLayout и вернулся к использованию autoresizingmasks. Он отлично работает с этой моделью. – outerstorm

ответ

23

Ограничения на автоопределение работают только с UIViews и их подклассами.

Хотя UIToolbar допускает некоторые UIView элементы на основе (например, как UISearchBar и UISegmentedControl) они, возможно, придется сосуществовать с UIBarButtonItems, которые не унаследуют от UIView.

До автовыключения может работать с UIBarButtonItems, сделайте, как вы это сделали.

Ваша альтернатива - сворачивать вашу собственную панель инструментов с виджетами, основанными только на UIViews.

+4

Любая идея, если Apple будет заниматься решением этой проблемы? Мне кажется, что несогласованность нарушена, если мне нужно использовать AL и старый подход в разных местах ... – Petar

7

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

+0

Если вы пытаетесь переместить существующую панель инструментов с использованием ограничений, вы обнаружите, что ограничение NSLayoutAttributeCenterX очень полезно. – russes

8

Это также можно сделать прямо с раскадровки.

Просто перетащите элементы на панели инструментов и поверните некоторые из них в гибкое или фиксированное пространство, чтобы получить желаемый эффект. См. Два примера ниже.

Evenly spaced

Centered

NB: это копия моего ответа на Aligning UIToolBar items, я stumbbled на оба вопроса, ища такого решения

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