2015-10-20 16 views
12

Ho un UICollectionView che contiene 12-13 UICollectionViewCells. Posso facilmente concentrarmi su UICollectionViewCells e tutto funziona. C'è un UIButton all'esterno di UICollectionView. Se sono sulla prima cella o sulla seconda cella e faccio scorrere verso l'alto, posso facilmente concentrarmi su UIButton. Quando sono sulla terza cella, non sono in grado di spostare lo stato attivo su UIButton. Qualche idea su cosa sta succedendo?UICollectionViewCell su UIButton Focus su tvOS

enter image description here

risposta

14

È necessario utilizzare un UIFocusGuide che abbraccia l'UIButton che si desidera mettere a fuoco. Rendi la UIFocusGuide larga quanto la collezioneView e abbastanza alta da coprire il pulsante. Crea il preferito FocusView sul pulsante.

UIFocusGuide *topButtonFocusGuide = [[UIFocusGuide alloc] init]; 
    topButtonFocusGuide.preferredFocusedView = myButton; 
    [self.view addLayoutGuide:topButtonFocusGuide]; 

    [self.view addConstraints:@[ 
    [topButtonFocusGuide.topAnchor constraintEqualToAnchor:myButton.topAnchor], 
    [topButtonFocusGuide.bottomAnchor constraintEqualToAnchor:myCollectionView.topAnchor], 
    [topButtonFocusGuide.leadingAnchor constraintEqualToAnchor:myCollectionView.leadingAnchor], 
    [topButtonFocusGuide.widthAnchor constraintEqualToAnchor:myCollectionView.widthAnchor], 
    ]]; 
+0

Grazie Jess - questo mi stava facendo impazzire. Nota che se hai un problema con questo, potrebbe essere perché uno dei tuoi punti di ancoraggio è incorporato in un'altra vista. Ho avuto una vista di raccolta all'interno di una vista di scorrimento e l'utilizzo della vista di raccolta in basso come il mio punto di ancoraggio superiore non ha funzionato. La modifica di questo nella parte inferiore della vista di scorrimento ha funzionato. – Reefwing

+0

Funziona come un fascino! Grazie. –

+0

Ciao Jess, ho un altro problema. Se ho il tasto a destra invece di sinistra e se ho solo una vista collezione di righe non riesco a rendere la vista raccolta messa a fuoco. Qualche soluzione per questo? –

2

soluzione Jess Bowers è quasi lì, ma Xcode dice UIButton s non ha topAnchor proprietà e la soluzione data dalla Jess non funziona per me.

Per me, la soluzione era di creare una vista enorme con la stessa larghezza del UICollectionView su di esso. Guarda l'immagine.

enter image description here

Il codice sarà questo:

UIFocusGuide *topButtonFocusGuide = [[UIFocusGuide alloc] init]; 
    topButtonFocusGuide.preferredFocusedView = myButton; 
    [self.view addLayoutGuide:topButtonFocusGuide]; 

    [self.view addConstraints:@[ 
    [topButtonFocusGuide.topAnchor constraintEqualToAnchor:transparentView.topAnchor], 
    [topButtonFocusGuide.bottomAnchor constraintEqualToAnchor:transparentView.bottomAnchor], 
    [topButtonFocusGuide.leadingAnchor constraintEqualToAnchor:transparentView.leadingAnchor], 
    [topButtonFocusGuide.widthAnchor constraintEqualToAnchor:transparentView.widthAnchor], 
    ]]; 
+0

UIButton è una sottoclasse di UIControl che è una sottoclasse di UIView. https://developer.apple.com/library/tvos/documentation/UIKit/Reference/UIButton_Class/ Guarda anche l'esempio di Apple che utilizza topAnchor su un pulsante. https://developer.apple.com/library/prerelease/tvos/samplecode/UICatalogFortvOS/Listings/UIKitCatalog_FocusGuidesViewController_swift.html –

+0

Ok ma Xcode dice che i pulsanti non hanno topAnchor e sfortunatamente la soluzione di Jess non funziona per me. – SpaceDog

+0

Qualcos'altro è sbagliato. Ho appena digitato un nome del mio pulsante, digitato .top e ho premuto escape e il completamento automatico mi ha mostrato topAnchor. Xcode corrente. Inoltre, la soluzione di Jess non funziona neanche per me. Esamino il telaio della guida in un punto di interruzione e sembra giusto. Ma non ha alcun effetto. –

0

Usa:

esclusione debole var preferredFocusedView: UIView? {Get { ritorno segmentedControl }}

0

Uno dei problemi che stava affrontando coinvolto utilizzando un UINavigationController per le pagine di destinazione per spingere dettaglio ViewControllers nello stack quando viene selezionato un elemento.

Ho inserito un punto di interruzione all'interno di UIButton canBecomeFocused override e l'utilizzo di questa breve estensione rapida ha chiesto al pulsante perché non è selezionabile.

extension UIView { 
    func whyNotFucusable() { 
     print(self.perform(Selector(("_whyIsThisViewNotFocusable"))).takeUnretainedValue()) 
    } 
} 

ho continuato a ricevere il seguente errore cercando di eseguire il debug ....

ISSUE: This view may not be focusable because other views or focus guides are occluding it. 

Prima di tutto ho guardato nel dizionario che diamine occlusione significava ....

verb, formal, technical 
    - stop, close up, or obstruct (an opening, orifice, or passage). 

La domanda ora era quale vista stia ostruendo il mio UIButton ???

Ho scartato rapidamente l'interfaccia utente nel debugger visivo e c'era una vista chiara sopra i miei UIButtons. Ispezionando la vista, ho scoperto che A differenza di iOS, in cui la barra di nagivazione ha un colore di sfondo di sistema predefinito, l'implementazione di tvOS ha un colore predefinito predefinito. Mi sono reso conto che non nascondevo la barra di navigazione, e in cambio mi ostruiva i pulsanti.

Ho fatto la seguente, e fissa tutti i miei problemi :)

navController.setNavigationBarHidden(true, animated: false) 

Spero che questo aiuti !!!

0

Swift 3.0

risposta di Jess Bower era enorme aiuto per me & salvato un sacco di tempo.

Ecco cosa ha funzionato con Swift 3 & tvOS 10. Ora è necessario utilizzare preferredFocusEnvironments. In ViewDidLoad()

 self.view.addLayoutGuide(focusGuide) 
     self.focusGuide.topAnchor.constraint(equalTo: self.buttonAbove.topAnchor).isActive = true 
     self.focusGuide.bottomAnchor.constraint(equalTo: self.CollectionView.topAnchor).isActive = true 
     self.focusGuide.leadingAnchor.constraint(equalTo: self.CollectionView.leadingAnchor).isActive = true 
     self.focusGuide.widthAnchor.constraint(equalTo: self.CollectionView.widthAnchor).isActive = true 
     self.focusGuide.preferredFocusEnvironments = [self.buttonAbove]