2015-11-23 4 views
5

Ich versuche, 6 Zeilen High Description Label zu implementieren und ich möchte es fokussierbar sein. Idealerweise würde das bedeuten, die UILabel-Klasse zu erweitern, um eine benutzerdefinierte Komponente zu erstellen. Ich versuchte das, indem ich canBecomeFocused und implementiere, aber mein UILabel scheint keinen Fokus zu bekommen.Make UILabel fokussierbar und tappable (tvOS)

Ich habe auch versucht, UILabel mit UIButton zu ersetzen, aber Tasten sind nicht wirklich für diese Art von Sache optimiert. Das würde auch bedeuten, dass ich buttonType im Fokus von benutzerdefiniert zu plain ändern müsste. Und buttonType scheint eine Ready-only-Eigenschaft zu sein.

In Wirklichkeit würde ich gerne genau dasselbe Text-Label von Apple in Apple TV Movies App implementiert haben. Für Filmbeschreibungen haben sie eine Textbeschriftung, die ein paar Zeilen Text und ein "mehr" anzeigt. Wenn es fokussiert wird, sieht es aus wie eine Schaltfläche (Schatten herum) und ändert die Hintergrundfarbe. Wenn Sie darauf tippen, öffnet sich ein modales Fenster mit der gesamten Filmbeschreibung.

enter image description here

Irgendwelche Vorschläge? Oder hat jemand dieses benutzerdefinierte Steuerelement bereits für tvOS implementiert? Oder besser - es gibt eine Komponente von Apple, die das tut und mir etwas fehlt.

PS: Swift Lösung wäre :)

Antwort

5

Ok willkommen sein, meine eigene Frage zu beantworten :)

So scheint es, dass einige einige Ansichten auf tvOS out-of-the-box "fokussierbar" sind, und andere müssen dazu angewiesen werden.

Ich endete schließlich mit UITextView, die eine selectable Eigenschaft hat, aber wenn nicht eine dieser fokussierbaren Ansichten standardmäßig. Die Bearbeitung von TextView muss deaktiviert werden, damit es wie UILabel aussieht. Außerdem gibt es derzeit einen Fehler, der die Verwendung der selectable -Eigenschaft von Interface Builder verhindert, aber von Code funktioniert.

Natürlich mussten auch canBecomeFocused() und didUpdateFocusInContext implementiert werden. Sie müssen auch UIViewController übergeben, da UITextView keinen Modal View-Controller darstellen kann. Balg ist was ich erschaffen habe.

class FocusableText: UITextView { 

    var data: String? 
    var parentView: UIViewController? 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     let tap = UITapGestureRecognizer(target: self, action: "tapped:") 
     tap.allowedPressTypes = [NSNumber(integer: UIPressType.Select.rawValue)] 
     self.addGestureRecognizer(tap) 
    } 

    func tapped(gesture: UITapGestureRecognizer) { 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 
     if let descriptionView = storyboard.instantiateViewControllerWithIdentifier("descriptionView") as? DescriptionViewController { 
      if let view = parentView { 
       if let show = show { 
        descriptionView.descriptionText = self.data 
        view.modalPresentationStyle = UIModalPresentationStyle.OverFullScreen 
        view.presentViewController(descriptionView, animated: true, completion: nil) 
       } 
      } 
     } 
    } 

    override func canBecomeFocused() -> Bool { 
     return true 
    } 

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 

     if context.nextFocusedView == self { 
      coordinator.addCoordinatedAnimations({() -> Void in 
       self.layer.backgroundColor = UIColor.blackColor().colorWithAlphaComponent(0.2).CGColor 
      }, completion: nil) 
     } else if context.previouslyFocusedView == self { 
      coordinator.addCoordinatedAnimations({() -> Void in 
       self.layer.backgroundColor = UIColor.clearColor().CGColor 
      }, completion: nil) 
     } 
    } 

} 
+0

Danke für diese Antwort, ich habe es ein wenig für mein Projekt geändert. https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

Hat sich in letzter Zeit etwas mit tvOS geändert, dass dies nicht funktionieren würde? Ich kann immer noch keinen TextView bekommen, um den Fokus zu bekommen, egal was ich versuche. Ich bin beide Routen durch kernelpanic und @Cedrick gegangen. –

+0

Ja, ich habe etwas Ähnliches für UIImageView erstellt und konnte es fokussieren (obwohl es nicht in einer Tabelle oder einer Collectionview ist), aber ich konnte die TextView nicht zum Laufen bringen. Keine Ahnung warum gerade jetzt wie ich alles oben erwähnte gemacht habe – c0d3Junk13

1

eine Sammlung Ansicht mit nur einer Zelle verwenden und in der Zelltransformation und Zellhintergrundfarbe in didUpdateFocusInContext wenn auf Zelle Fokus bewegt ändern.

override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
    coordinator.addCoordinatedAnimations({ 
     if self.focused { 
      self.transform = CGAffineTransformMakeScale(1.01, 1.01) 
      self.backgroundColor = UIColor.whiteColor() 
      self.textLabel.textColor = .blackColor() 
     } 
     else { 
      self.transform = CGAffineTransformMakeScale(1, 1) 
      self.backgroundColor = UIColor.clearColor() 
      self.textLabel.textColor = .whiteColor() 
     } 
     }, completion: nil) 
} 

Als zusätzlichen Schritt kann man versuchen, die Farbe des Bildes zu extrahieren, wenn Sie das Bild als Hintergrund wie iTunes verwenden und dass hinter der Zelle für Visual Effekt-Ansicht verwenden.

Sie können auch auf die Collection in den Video-Controller anwenden verwandeln, um es wie

-1

im Fokus aussehen können Sie System-Taste verwenden, und legen Sie das Hintergrundbild in Storyboard zu einem Bild, das die Farbe enthält möchten Sie

+0

Er möchte UILabel oder UITextView verwenden. Die Benutzung der Systemtaste ist eine schreckliche Lösung. –