2015-12-21 13 views
5

Sono completamente nuovo per TVOS e sto cercando di attuare una vista UISearchController in cui, nel mio SearchResultsViewController, ho due UICollectionViews visualizzato uno sopra l'altro: enter image description hereCome ignorare la tastiera in UISearchController quando si cambia focus in tvos?

Il problema è che quando l'utente fendenti verso il basso per selezionare uno degli elementi in UICollectionView, la tastiera non viene ignorata. Anche scorrere verso l'alto per selezionare la tastiera non scorre completamente ed è impossibile vedere cosa stai digitando. Il panorama che ne risulta è questo: enter image description here

Idealmente, mi piacerebbe chiudere la tastiera quando l'utente swipes per mettere a fuoco su qualsiasi altra cosa nell'interfaccia. Ho guardato Apple tvos UIKit Catalog e il loro esempio mostra un UISearchController che chiude la tastiera quando si cambia messa a fuoco, ma non vedo che stiano facendo qualcosa di diverso.

Ecco il codice che sto usando per installare il mio UISearchController quando l'utente fa clic su un pulsante:

@IBAction func onSearchButton(sender: AnyObject) { 
    guard let resultsController = storyboard?.instantiateViewControllerWithIdentifier(SearchResultsViewController.storyboardID) as? SearchResultsViewController else { fatalError("Unable to instantiate a SearchResultsViewController.") } 

    // Create and configure a `UISearchController`. 
    let searchController = UISearchController(searchResultsController: resultsController) 
    searchController.searchResultsUpdater = resultsController 
    searchController.hidesNavigationBarDuringPresentation = false 

    let searchPlaceholderText = NSLocalizedString("Search for a Show or Movie", comment: "") 
    searchController.searchBar.placeholder = searchPlaceholderText 

    // Present the search controller from the root view controller. 
    guard let rootViewController = view.window?.rootViewController else { fatalError("Unable to get root view controller.") } 
    rootViewController.presentViewController(searchController, animated: true, completion: nil) 
} 

risposta

4

Dopo un po 'di tentativi ed errori, sono stato in grado di capire la soluzione.

La tastiera verrà automaticamente respingere stessa finché: 1) L'articolo l'utente fa click su si trova all'interno di uno ScrollView 2) La dimensione contenuto ScrollView è maggiore dell'altezza dello schermo di almeno 1 pixel (1081px).

+0

Sono alle prese con questo problema, la modifica dell'altezza del contenuto dello scrollview non ha risolto il problema per me. Come hai strutturato i tuoi controller di visualizzazione? –

+0

@AaronStephenson Anch'io sto affrontando lo stesso problema. Hai trovato qualche soluzione per il problema? –

3

Dopo un sacco di tentativi ed errori, finalmente ho capito. Il motivo è che hai ScrollViews nidificati in searchResultsController.

"ScrollViews" include ovviamente UICollectionView, UITableView e UIScrollView.

Secondo le mie indagini, UISearchController si comporta come segue.

  1. Se la prima vista che viene messo a fuoco in searchResultsController è visualizzazione secondaria del ScrollView interna (che è l'UICollectionView orizzontale, nel tuo caso), allora non sarà possibile ottenere la tastiera nascosta come previsto.

  2. È interessante notare che se la prima vista che viene focalizzata in searchResultsController è una sottoview di scrollView esterno, la tastiera verrà nascosta completamente, animata, proprio come previsto (!).

Penso che questo sia una specie di bug di UIKit.

0

Avevo esattamente lo stesso layout e non sono riuscito a raggiungere questo risultato. Credo che tu restituisca false in tableView (tableView: UITableView, canFocusRowAtIndexPath indexPath: NSIndexPath) -> Bool in modo che ogni cella nella vista della raccolta possa scorrere orizzontalmente con il corretto comportamento del focus. Penso che stia effettivamente causando i problemi. Se si effettua la messa a fuoco della prima cella nella vista tabella, il problema scompare, ma ovviamente non si desidera mettere a fuoco il comportamento. L'ho appena scoperto oggi e proverò più domani per scoprire cosa posso fare al riguardo. Sento che avrò bisogno di un nuovo design che mi permetta di usare una singola collectionview o tableview che ha le sue celle focalizzabili nei risultatiController. Spero che ciò sia facilmente ottenibile in tvOS 10.

0

Soluzione di lavoro: aggiungere una cella fittizia in indexPath.riga == 0 con altezza pari a 1 pixel e abilita la messa a fuoco su di esso.