Estoy tratando de implementar un UISlider personalizado (subclase de UISlider), que se comporta de forma similar al control deslizante nativo que tiene un brillo alrededor del pulgar cuando está resaltado. Aunque estoy teniendo problemas con esto.UISlider resalta estado con ancho de pulgar diferente de lo normal
El ancho (efectivo) del pulgar resaltado es obviamente mayor que el pulgar normal (debido al brillo). Si agrego relleno de píxeles transparente a la imagen de estado normal, de modo que ambas imágenes tengan el mismo ancho, el problema es que el pulgar de estado normal nunca parece que llegue al final de la pista (llega al final, pero el relleno hace parece lo contrario).
Si uso thumbRectForBounds: para compensar el pulgar a alinear correctamente con el comienzo de la pista, solo empeora el problema en el otro extremo.
Si conservo las dos imágenes solo lo que necesitan (es decir, sin relleno en el estado normal, y las dos no tienen el mismo ancho), me he acercado. Puedo establecer el desplazamiento de forma independiente en thumbRectForBounds: basado en UIControl.state, pero parece que hay algo de magia matemática detrás de las escenas. El único lugar donde el UISlider cree que las imágenes para ambos estados se alinean perfectamente es el centro exacto.
Parece que podría necesitar implementar algunos cálculos matemáticos que determinen el desplazamiento del estado de resaltado en función de su posición relativa a lo largo de la pista. Necesitaría un desplazamiento y de cero en el centro (el UISlider centraría ambas imágenes, lo que significa que se alinearían). En los extremos, necesitaría un desplazamiento en y que compensa por completo el resplandor. Y en el medio necesitaría interpolar el desplazamiento y.
Esto parece mucho trabajo para recrear algo que el control deslizante nativo hace, así que tal vez me falta algo obvio.
actualización solución actual:
No está completamente portátil, ya que hace que se agregan algunas suposiciones sobre el tamaño de la resplandor. Estoy agregando el resplandor con una imagen en lugar de dibujarlo directamente en el CALayer. No he probado qué tan eficiente es todavía.
Básicamente creo una capa que es un cuadrado cuyas dimensiones son la altura de la imagen de estado predeterminada, centrarla sobre el pulgar y luego dibujar el resplandor (solo el resplandor, no una imagen separada de un pulgar con brillo , como se haría con una imagen de estado de hightlight) en la capa.
- (CGRect)thumbRectForBounds:(CGRect)bounds trackRect:(CGRect)rect value:(float)value {
CGRect r = [super thumbRectForBounds:bounds trackRect:rect value:value];
[thumbHighlightOverlayLayer removeFromSuperlayer];
thumbHighlightOverlayLayer = [CALayer layer];
int x = r.origin.x + (r.size.width/2) - (r.size.height/2);
thumbHighlightOverlayLayer.frame = CGRectMake(x, r.origin.y, r.size.height, r.size.height);
UIImage* thumbHighlightOverlayImage = [UIImage imageNamed:@"thumb-highlight"];
thumbHighlightOverlayLayer.contents = (id)thumbHighlightOverlayImage.CGImage;
switch (self.state) {
case UIControlStateHighlighted:
[[self layer] addSublayer:thumbHighlightOverlayLayer];
break;
default:
break;
}
return r;
}
http://stackoverflow.com/questions/755510/customizing-uislider-look – VSN
La pregunta es principalmente respecto a la imagen de la pista, no a la imagen de pulgar. Escribir mi propio control deslizante aún puede ser la única respuesta aquí, pero dado que estoy tratando de recrear el comportamiento nativo, todavía me pregunto si hay alguna manera de evitar tener que hacer eso. – farski