2012-11-26 9 views
8

Ich versuche, eine UIButton in einer UICollectionView-Zusatzansicht (Fußzeile) zu platzieren. Ich habe das UIButton mit Storyboards zu einer Unterklasse von UICollectionViewCell verbunden und kann seine Eigenschaften programmgesteuert einschließlich des Hintergrundbilds ändern. Wenn ich jedoch das Touch-up-Ereignis des Buttons an eine Methode anschließe, wird es nicht ausgelöst. In der Tat scheint der Knopf nicht einmal visuell auf die Berührung des Benutzers zu reagieren. Bei der Problembehandlung habe ich versucht, dem Header der Sammlungsansicht eine UIB-Schaltfläche hinzuzufügen und identisches Verhalten zu sehen. Das Hinzufügen der Schaltfläche zu einer nicht verwandten Ansicht erzeugt Interaktionseffekte, wenn sie gedrückt wird.Wie kann ich einen UIButton in einer UICollection-Zusatzansicht verwenden?

Gibt es etwas Besonderes, um eine UIButton in einer UICollection-Zusatzansicht zu implementieren?

Antwort

16

Eine zusätzliche Ansicht sollte eine UICollectionReusableView (oder Unterklasse davon) sein, nicht eine UICollectionViewCell.

Wie auch immer, wenn die Schaltfläche nicht reagiert, ist das erste, was zu tun ist zu überprüfen, dass alle seine Vorfahren Ansichten userInteractionEnabled auf YES festgelegt haben. Pause im Debugger, sobald die Taste auf dem Bildschirm ist und dies tun:

(lldb) po [[UIApp keyWindow] recursiveDescription] 

Finden Sie die Schaltfläche in der Liste, und kopieren Sie die Adresse. Dann können Sie es und jede Superview überprüfen. Beispiel:

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

Hier fand ich, dass alle Ansichten bis zur Wurzel (die UIWindow) zurückkehren YES von isUserInteractionEnabled. Die Superansicht des Fensters ist null.

+1

@robmayhoff: Das Problem war die Tatsache, dass ich die falschen Eltern unterklassifiziert hatte. Danke, dass du das gefunden hast! – markdorison

+0

@markdorison Ha ha, interessant. Ich habe nicht wirklich erwartet, dass das das Problem ist. –

+0

@robmayhoff: Ich war so überrascht wie du warst, als ich die eine Veränderung machte und es funktionierte! – markdorison

0

Ich habe eine benutzerdefinierte Schaltfläche, die Unterklassen UIControl und setzen Sie es in eine UICollectionReusableView. Damit es funktioniert, habe ich jede einzelne Unteransicht des Steuerelements und die Unteransichten seiner Unteransichten ohne Benutzerinteraktion erstellt.

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 dieser Code hinzufügen, werden alle Ereignis-Listener .TouchUpInside würde Feuer, und die Steuerung wird visuell hervorzuheben, wenn die Taste gedrückt.

Verwandte Themen