2010-12-13 19 views
16


fondamentalmente mi devo pulsante di immagini, in particolare un oggetto personalizzato che:
1) chiama l'azione di un controllore quando sfruttato
2) incapsula dati personalizzati
3) si sposta automaticamente da vista involucro (non rilevante)Evidenziazione una sottoclasse UIControl

Bene, ho ottenuto tutto questo con una sottoclasse di UIControl (dal sottoclasse UIButton non è raccomandato e sottoclassi UIImageView rende difficile gestire il punto 1). Ma ora qual è il modo corretto per evidenziarlo? Vorrei evidenziare il controllo quando toccato in qualsiasi modo (anche una semplice riduzione momentanea di alfa).

Con beginTrackingWithTouch e endTrackingWithTouch Non riesco a riconoscere l'unico evento UIControlEventTouchUpInside.

Un'animazione vista nel controller? Mi sembra una soluzione approssimativa

Esiste una soluzione semplice e immediata?

Grazie :(

risposta

35

Penso UIControls impostati automaticamente la loro proprietà evidenziata correttamente, basata esclusivamente su eventi touch Quello che vi serve è quello di sovrascrivere -setHighlighted: metodo per implementare un algoritmo specifico:.

- (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

Se avete subviews, non dimenticate di impostare mySubview.userInteractionEnabled = NO (altrimenti il ​​rubinetto non verrà registrato e non l'evidenziazione verrà attivata). –

12

Nel interessi di mantenere questa risposta up-to-date, qui è la Swift versione (della risposta di 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. 
    } 
} 

si può anche come a svanire l'oscuramento del UIControl. Per fare questo, è sufficiente posizionare l'assegnazione alfa in un blocco di animazione, come questo

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

Ho scoperto che l'uso di 'didSet' causato da ritardi deve essere ritardato. 'set (evidenziato) {' ha funzionato meglio - ma solo se non ho chiamato super – Sam

0

Per evidenziare subviews di UIControl correttamente è possibile utilizzare il colore della tinta personalizzata. A tal fine, da qualche parte nel init metodi o awakeFromNib si dovrebbe cambiare l'immagine modalità di rendering a 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 

Così, invece di cambiare alpha valore possiamo cambiare il colore della tinta e cambierà automaticamente le UIImageView subviews. Nel metodo setHighlighted: è possibile modificare il testo e il colore della tinta e un colore più scuro:

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