ios uibarbuttonitem uitoolbar autolayout autoresizingmask

Autolayout de iOS y UIToolbar/UIBarButtonItems



autoresizingmask (3)

Tengo una vista de iOS con la opción de reproducción automática habilitada y tengo una barra de herramientas de la UIToolbar con una UISearchBar y UISegmentControl contenidas en 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 puedo agregar restricciones a los elementos en una UIToolbar de UIToolbar en Interface Builder. Las opciones están todas deshabilitadas.

Antes de AutoLayout lograría esto con autoresizingmasks .

¿No se permiten restricciones dentro de UIToolbars/UINavigationBars ?

¿De qué otra manera se puede lograr esto cuando se utiliza la reproducción automática?


Esto también se puede hacer directamente desde un guión gráfico.

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

NB: esta es una copia de mi respuesta a Aligning UIToolBar items , me topé con ambas preguntas mientras buscaba tal solución.


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

Si bien UIToolbar permite que algunos UIView basados ​​en UIView (como UISearchBar y UISegmentedControl ) tengan que coexistir con UIBarButtonItems que no heredan 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 menos; Soy del tipo que abandona el Constructor de Interfaz y lo va en código de todos modos. El IB parece interponerse en mi camino más a menudo que no cuando se trata de agregar o modificar restricciones. Esto es lo que he hecho en el UIToolbar personalizado UIToolbar subclase 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 como me gusta cargar la carga lo más posible, aquí está mi variable de instancia self.label (llamada cuando [self addSubview:self.label] se ha enviado un mensaje arriba).

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

Parece funcionar para mi. UIBarButtonItems embargo, no estoy agregando ningún UIBarButtonItems , por lo que su millaje puede variar.