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.