2010-12-13 10 views
16


básicamente necesito un botón de imagen, específicamente un objeto personalizado que:
1) llama a la acción de un controlador cuando se le golpea
2) encapsula los datos personalizados
3) se desplaza automáticamente por la vista envoltorio (no es relevante)Destacando una subclase uicontrol

Bueno, tengo todo esto con una subclase de UIControl (ya que la subclasificación UIButton no se recomienda y subclases UIImageView hace difícil de gestionar el punto 1). Pero ahora, ¿cuál es la forma correcta de resaltarlo? Me gustaría resaltar el control cuando se toca de cualquier manera (incluso una simple reducción momentánea de alfa).

Con beginTrackingWithTouch y endTrackingWithTouch No puedo reconocer el único evento UIControlEventTouchUpInside.

¿Ver animación en el controlador? Me parece una solución aproximada

¿Existe una solución simple e inmediata?

Gracias :(

Respuesta

35

Creo UIControls ajustan automáticamente su propiedad resaltado correctamente, basándose únicamente en eventos táctiles Lo que necesita es reemplazar -setHighlighted: método para implementar un algoritmo específico:.

- (void) setHighlighted: (BOOL) highlighted { 
    [super setHighlighted: highlighted]; 
    // Only as an example. Caution: looks like a disabled control 
    self.alpha = highlighted ? 0.5f : 1.0f; 
} 
+4

Si tiene alguna subvistas, no se olvide de establecer mySubview.userInteractionEnabled = NO (de lo contrario el grifo no será registrado y ningún resaltar se activará). –

12

En el intereses de mantener esta respuesta actualizada, aquí está la Swift versión (de la respuesta de Costique).

override var highlighted: Bool { 
    didSet { 
     alpha = highlighted ? 0.6 : 1.0 // Sets alpha to 0.6 if highlighted, or 1.0 if it's not. 
    } 
} 

También es posible que desee atenuar la atenuación del UIControl. Para ello, basta con colocar la asignación alfa en un bloque de animación, como esto

override var highlighted: Bool { 
    didSet { 
     UIView.animateWithDuration(0.25) { _ in 
      self.alpha = self.highlighted ? 0.6 : 1.0 
     } 
    } 
} 
+0

Descubrí que se debe retrasar el uso de 'didSet' causado por toques. 'set (highlight) {' funcionó mejor, pero solo si no llamé a super – Sam

0

a destacar subvistas de UIControl correctamente puede usar el tinte de color personalizado. Para permitir esto, en algún lugar de init métodos o awakeFromNib debe cambiar la imagen a modo de representación always template:

self.imageView.image = [self.imageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
self.backgroundImageView.image = [self.backgroundImageView.image imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 
self.tintColor = [UIColor zst_blueColor]; // Use custom instead of system-defined color 

Así que en lugar de cambiar alpha valor que podemos cambiar el color de tinte y cambiará sus UIImageView subvistas automáticamente. En el método setHighlighted: se puede cambiar el texto y el color de tinte para un color más oscuro:

- (void)setHighlighted:(BOOL)highlighted 
{ 
    [super setHighlighted:highlighted]; 
    UIColor *tintColor = highlighted ? [UIColor zst_darkerBlueColor] : [UIColor zst_blueColor]; 
    self.tintColor = tintColor; 
    self.titleLabel.textColor = tintColor; 
} 
Cuestiones relacionadas