Usar NSLayoutConstraint en una subvista en conjunción con una transformada afín

Necesito tener controles deslizantes verticales. Para hacer esto, tengo una class UIView que contiene un UISlider , y dentro de initWithFrame: giro el control deslizante con una transformación afín por 90 grados.

Ahora estoy agregando soporte para Autolayout.

Deseo permitir que el control deslizante se cree con diferentes longitudes, de modo que se pueda usar en un sentido dynamic de Autolayout. Este es el código que bash para que el control deslizante girado se ajuste a los límites de UIView , ubicado en initWithFrame:

 self = [super initWithFrame:frame]; if(self) { self.slider = [[UISlider alloc] init]; [self addSubview:self.slider]; self.slider.value = 0; self.slider.transform = CGAffineTransformMakeRotation(M_PI * 1.5); [self.slider setTranslatesAutoresizingMaskIntoConstraints:NO]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.slider attribute: NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.slider attribute: NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.slider attribute: NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeLeft multiplier:1.0f constant:0.0f]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:self.slider attribute: NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeTop multiplier:1.0f constant:0.0f]]; self.backgroundColor = [UIColor colorWithWhite:.8 alpha:1.0]; self.layer.borderWidth = 1; self.slider.backgroundColor = [UIColor colorWithRed:.21 green:.95 blue:1 alpha:1]; self.slider.layer.borderWidth = 1; return self; } 

Esto es como se ve la vista resultante. Instancé tres diferentes controles deslizantes verticales. El de la izquierda tiene un marco de 300 por 300, el de la derecha tiene un marco de 50 por 300 y el de la mitad tiene un marco de 300 por 50. He coloreado el background de los frameworks UIView para ser gris, y colorear el background de los UISliders para ser azul.

Instancias de control deslizante vertical

El problema con el 300 por 300 uno es que no creo que pueda permitirse tener el marco tan grande. Habrá otras vistas alnetworkingedor, y me temo que eso se interpondrá en el path.

El problema con el de la izquierda es que el control deslizante es demasiado pequeño.

El problema con el que está en el medio es que, dado que el control deslizante se ha girado fuera del marco de la vista, es imposible tomar el pulgar y moverlo.

También intenté restringir la parte superior del control deslizante a la derecha de la vista, y la derecha del control deslizante al final de la vista, pero esto produce errores y resultados impnetworkingecibles.

¿Qué debo cambiar para que estas restricciones funcionen?

Más simple de lo que parece. El padre UIView está configurado para cumplir con las restricciones de layout. Puede gestionar su subvista del control deslizante mucho más simplemente. Aquí está toda la class. Esto se puede crear en el código con initWithFrame: o soltar una vista en IB y establecer la class == TwistedSlider . Aquí está todo …

 @interface TwistedSlider () @property(weak,nonatomic) UISlider *slider; @end @implementation TwistedSlider - (UISlider *)slider { if (!_slider) { UISlider *slider = [[UISlider alloc] init]; [self addSubview:slider]; _slider = slider; } return _slider; } // this works for any size of this view. the slider will always be as tall as this view is wide - (void)layoutSubviews { [super layoutSubviews]; // size it to be as wide as this view's height, center it in this view self.slider.bounds = CGRectMake(0, 0, self.bounds.size.height, self.slider.bounds.size.height); self.slider.center = [self convertPoint:self.center fromView:self.superview]; // rotate it self.slider.transform = CGAffineTransformMakeRotation(M_PI_2); } // that's it! @end