2015-11-23 12 views
5

Sto tentando di implementare un'etichetta descrittiva di 6 righe e desidero che sia focalizzabile. Idealmente ciò significherebbe estendere la classe UILabel per creare un componente personalizzato. L'ho provato implementando canBecomeFocused e didUpdateFocusInContext ma la mia UILabel non sembra avere alcun focus.Rendi UILabel attivabile e toccabile (tvOS)

Ho anche provato a sostituire UILabel con UIButton, ma i pulsanti non sono realmente ottimizzati per questo genere di cose. Ciò significherebbe anche che avrei bisogno di cambiare buttonType in focus da custom a plain .. e buttonType sembra essere una proprietà ready-only.

In realtà mi piacerebbe avere la stessa etichetta di testo implementata da Apple nell'app Apple TV Movies. Per la descrizione del film hanno un'etichetta di testo che mostra alcune righe di testo e un "altro". Quando è a fuoco sembra un pulsante (ombre intorno) e cambia colore di sfondo. Quando toccato - apre una finestra modale con l'intera descrizione del film.

enter image description here

Qualche suggerimento? O forse qualcuno ha già implementato questo controllo personalizzato per tvOS? O meglio, c'è un componente di Apple che fa questo e mi manca qualcosa.

PS: Swift soluzione sarebbe il benvenuto :)

risposta

5

Ok, rispondendo alla mia domanda :)

Così sembra che alcune alcuni punti di vista sono "attivabile" on TVOS out-of-the-box, e altri devono essere istruiti a farlo.

Finalmente ho finito con l'utilizzo di UITextView, che ha una proprietà selectable, ma se non è una di queste viste selezionabili per impostazione predefinita. La modifica di TextView deve essere disattivata per renderla simile a UILabel. Inoltre, attualmente c'è un bug che ti impedisce di usare la proprietà selectable da Interface Builder ma funziona dal codice.

Naturalmente, è necessario implementare anche canBecomeFocused() e didUpdateFocusInContext. È inoltre necessario passare un UIViewController perché UITextView non è in grado di presentare un controller di visualizzazione modale. Il muggito è quello che ho finito per creare.

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

Grazie per questa risposta, l'ho modificata un po 'per il mio progetto. https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

Qualche cosa è cambiato con tvOS ultimamente che potrebbe causare il mancato funzionamento? Non riesco ancora a ottenere un TextView per ottenere l'attenzione, non importa quello che provo. Ho seguito entrambe le rotte da kernelpanic e @Cedrick. –

+0

Sì, ho creato qualcosa di simile per UIImageView e sono stato in grado di focalizzarlo (anche se non è all'interno di una tabella o di una collezione) ma non ho potuto far funzionare TextView. Non ho idea del perché adesso come ho fatto tutto quanto sopra menzionato – c0d3Junk13

1

utilizzare una visualizzazione di raccolta con un solo cellulare e aggiungere trasformare al cellulare e cambiare il colore di sfondo della cella in didUpdateFocusInContext quando attivo passa alla cella.

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) 
} 

Come un ulteriore passo si potrebbe tentare di estrarre il colore dell'immagine se si utilizza l'immagine come sfondo come iTunes e l'uso che per la vista visivo effetto dietro la cellula.

Inoltre è possibile applicare trasformare per il CollectionView nel controller video per far sembrare a fuoco

-1

È possibile utilizzare il pulsante del sistema, e impostare l'immagine di sfondo in storyboard a un'immagine che contiene il colore che si desidera

+0

Vuole usare UILabel o UITextView. L'utilizzo del pulsante di sistema è una soluzione orribile. –