2012-11-26 9 views
8

Sto tentando di posizionare un UIButton in una vista supplementare di UICollectionView (piè di pagina). Ho collegato UIButton usando gli storyboard a una sottoclasse di UICollectionViewCell e posso cambiarne le proprietà a livello di codice, inclusa l'immagine di sfondo. Tuttavia, quando collego il ritocco all'interno dell'evento del pulsante a un metodo, esso non si attiva. In effetti, il pulsante non sembra nemmeno rispondere visivamente al tocco dell'utente. Nella risoluzione dei problemi, ho tentato di aggiungere un UIButton all'intestazione della vista dell'insieme e di visualizzare un comportamento identico. L'aggiunta del pulsante a una vista non correlata produce effetti di interazione quando viene premuto.Come posso usare un UIButton in una vista supplementare di UICollection?

C'è qualcosa di speciale che devo fare per implementare un UIButton in una vista supplementare di UICollection?

risposta

16

Una vista supplementare deve essere una UICollectionReusableView (o sottoclasse), non una UICollectionViewCell.

In ogni caso, se il pulsante non risponde, la prima cosa da fare è controllare che tutte le sue visualizzazioni precedenti abbiano userInteractionEnabled impostato su YES. Pausa nel debugger una volta il pulsante è sullo schermo e fare questo:

(lldb) po [[UIApp keyWindow] recursiveDescription] 

trovare il pulsante nella lista e copiare il suo indirizzo. Quindi puoi controllarlo e ogni superview. Esempio:

(lldb) p (BOOL)[0xa2e4800 isUserInteractionEnabled] 
(BOOL) $4 = YES 
(lldb) p (BOOL)[[0xa2e4800 superview] isUserInteractionEnabled] 
(BOOL) $5 = YES 
(lldb) p (BOOL)[[[0xa2e4800 superview] superview] isUserInteractionEnabled] 
(BOOL) $6 = YES 
(lldb) p (BOOL)[[[[0xa2e4800 superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $8 = YES 
(lldb) p (BOOL)[[[[[0xa2e4800 superview] superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $9 = YES 
(lldb) p (BOOL)[[[[[[0xa2e4800 superview] superview] superview] superview] superview] isUserInteractionEnabled] 
(BOOL) $10 = NO 
(lldb) po [[[[[0xa2e4800 superview] superview] superview] superview] superview] 
(id) $11 = 0x00000000 <nil> 

qui ho trovato che tutte le viste fino alla radice (il UIWindow) tornano YES da isUserInteractionEnabled. Il superview della finestra è pari a zero.

+1

@robmayhoff: il problema era il fatto che avevo sottoclasse il genitore sbagliato. Grazie per aver catturato questo! – markdorison

+0

@markdorison Ah ah, interessante. Non mi aspettavo davvero che questo fosse il problema. –

+0

@robmayhoff: Sono rimasto sorpreso quanto te quando ho apportato l'unica modifica e ha funzionato! – markdorison

0

Ho un pulsante personalizzato che sottoclasse UIControl e lo inserisce in un UICollectionReusableView. Per farlo funzionare, ho fatto in modo che ogni singola sottoview del controllo e le sottoview delle sue sottoview non gestissero l'interazione dell'utente.

func disableUserInteractionInView(view: UIView) { 
    view.userInteractionEnabled = false 
    for view in view.subviews { 
     self.disableUserInteractionInView(view) 
    } 
} 

// My control has a subview called contentView which serves as a container 
// of all my custom button's subviews. 
self.disableUserInteractionInView(self.contentView) 

Da aggiungendo che il codice, tutti gli ascoltatori di eventi a .TouchUpInside avrebbero sparato, e il controllo saranno visivamente in evidenza quando viene premuto verso il basso.

Problemi correlati