iOS Autolayout y UIToolbar / UIBarButtonItems

Tengo una vista de iOS con autolayout habilitada y tengo una UIToolbar con un UISearchBar y UISegmentControl contenida con la barra de herramientas. Quiero que UISearchBar tenga un ancho flexible, así que necesito agregar una restricción para forzar esto, pero por lo que puedo decirte no puedes agregar restricciones a los elementos en una UIToolbar en Interface Builder. Las opciones están todas deshabilitadas.

Antes de AutoLayout lo haría con autoresizingmasks .

¿No se permiten restricciones dentro de UIToolbars/UINavigationBars ?

¿De qué otra manera se puede lograr esto al usar la function de reproducción automática?

Las restricciones de reproducción automática solo funcionan con UIViews y sus subclasss.

Aunque UIToolbar permite que algunos UIView basados ​​en UIView (como UISearchBar y UISegmentedControl ) tengan que coexistir con UIBarButtonItems que no henetworkingan de UIView .

Hasta que Autolayout pueda funcionar con UIBarButtonItems , haz lo que has hecho.

Su alternativa es rodar su propia barra de herramientas con widgets basados ​​solo en UIViews .

Puedes hacer esto en código, al less; Soy el tipo para renunciar a Interface Builder e ir de código de todos modos. IB parece estar en mi path más de las veces cuando se trata de agregar o ajustar restricciones. Esto es lo que he hecho en el método -initWithFrame: subclass de -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; } 

Y dado que me gusta cargar perezoso tanto como sea posible, aquí está mi variable de instancia self.label (llamada cuando [self addSubview:self.label] recibe el post anterior).

 - (UILabel *)label { if (_label) return _label; _label = [UILabel new]; _label.translatesAutoresizingMaskIntoConstraints = NO; _label.textAlignment = NSTextAlignmentCenter; return _label; } 

Parece funcionar para mi. UIBarButtonItems embargo, no agrego ninguna UIBarButtonItems , por lo que su kilometraje varía.

Esto también se puede hacer directamente desde un storyboard.

Simplemente arrastre y suelte elementos en la barra de herramientas y convierta algunos de ellos en un espacio flexible o fijo para get el efecto deseado. Vea los dos ejemplos a continuación.

Eventualmente separados

Centrado

Nota: esta es una copy de mi respuesta a Alinear los artículos de UIToolBar , tropecé con ambas preguntas mientras buscaba tal solución