2015-09-16 4 views
5

Mit UIButton produziert tvOS UIControlEvents.PrimaryActionTriggered (nicht .TouchUpInside, wie es auf iOS tut), wenn die Schaltfläche den Fokus erhält und der Benutzer auf die Fernbedienung tippt.Welche Ereignisse werden von UIControl auf tvOS produziert?

UIControl scheint nicht entweder dieser Ereignisse jedoch zu produzieren. Ich kann nicht sehen, dass es tatsächlich Ereignisse erzeugt, wenn der Benutzer sich auf das Steuerelement konzentriert und auf die Fernbedienung tippt.

Wie verwendet man eine benutzerdefinierte UIControl für tvOS?

+1

Haben Sie versucht, die Klasse zu untergliedern und einen Haltepunkt in 'sendAction: to: forEvent:'? –

Antwort

4

Ein UIControl gibt keine Kontrollereignisse von sich aus aus. Ihre Unterklasse ist verantwortlich für die Ausgabe von Ereignissen (in der Regel durch das Senden selbst sendActionsForControlEvents:).

Da UIControl derzeit nicht für tvOS dokumentiert ist, könnte es sein, dass Apple nicht möchte, dass Sie eine Unterklasse erstellen.

Auf jeden Fall habe ich nur gespielt mit ihm um ein wenig, aber anscheinend Ihre eigene UIControl Unterklasse implementieren, müssen Sie canBecomeFocused außer Kraft setzen YES zurückzukehren, und Sie müssen pressesEnded:withEvent: auf dem Benutzer Presse zu handeln außer Kraft setzen (vermutlich selbst das Senden sendActionsForControlEvents:.).

Sie können auch pressesBegan:withEvent: überschreiben, um Ihr Steuerelement hervorzuheben.

Da UIControl zum UIFocusEnvironment Protokoll entspricht (zum UIView) können Sie didUpdateFocusInContext:withAnimationCoordinator: außer Kraft setzen Ihre Kontrolle Auftritt je nach zu aktualisieren, ob es den Fokus hat.

+0

Ein paar Nitpicks: 'pressBegin: withEvent:' sollte 'pressBegan: withEvent:' sein, und es gibt keine 'setFocus: 'Methode auf UIControl. Aber Sie können 'didUpdateFocusInContext: withAnimationCoordinator:' überschreiben, um zu wissen, wann sich der Fokus geändert hat, und sehen, ob Ihr Steuerelement fokussiert ist. –

+0

Danke für die Korrekturen. Ich habe meine Antwort aktualisiert. –

+0

Ok, das scheint vernünftig und ich kann es versuchen ... aber ich bin verwirrt: In iOS habe ich mehrere Beispiele von Unterklassen von UIControl, die nichts wie sendActionsForControlEvents und nur myControl.addTarget implementieren (self, action: "berührte: "forControlEvents: .TouchUpInside) funktioniert gut ... –

0

Ich verbrachte die letzten Wochen damit, tvOS-Unterstützung für die Widgets hinzuzufügen, die ich mit meiner SVG-Rendering-Bibliothek SVGgh paketiere, also habe ich ein gewisses Gefühl dafür. Das Problem ist, dass es eine neue oder neue Art von Aktion gibt: UIControlEventPrimaryActionTriggered, die gesendet wird, wenn das Steuerelement eine Handlungsverpflichtung kommunizieren will, wie in dieser Antwort auf die Fertigstellung eines UIPress in meiner GHButton Klasse. Denken Sie daran, einen Selektor an diese neue Aktion in Ihrem Storyboard anzuschließen.

-(void) pressesEnded:(NSSet<UIPress *> *)presses withEvent:(UIPressesEvent *)event 
{ 
    [self sendActionsForControlEvents:UIControlEventPrimaryActionTriggered]; 
    self.beingPressed = NO; 
    self.selected = self.selected; 
} 

Aber in einer analogen segmentierten Steuerung, die Aktion wird auf Knopfdruck nicht gesetzt ist, aber wenn das fokussierte Segment, wie in dem folgenden (stark bearbeiten für Klarheit) Code von meiner GHSegmentedControl Klasse geändert wird:

Jetzt, da ich daran denke, ist es möglich, dass ich auch eine UIControlEventPrimaryActionTriggered-Aktion im segmentierten Steuerelement aussenden sollte, aber UIControlEventValueChanged scheint so zu funktionieren, wie ich es erwarte.

Verwandte Themen