Sto implementando un codice personalizzato per gestire un clic sul pulsante Menu sul telecomando Siri. Come posso forzare la messa a fuoco per passare al menu personalizzato quando si preme il pulsante menu?Come posso forzare la messa a fuoco su una vista specifica in tvOS?
risposta
Finalmente ho capito da solo. Devi sostituire la proprietà preferredFoucsedView
del tuo UIView
o UIViewController
.
a Swift va in questo modo:
func myClickHandler() {
someCondition = true
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
someCondition = false
}
override weak var preferredFocusedView: UIView? {
if someCondition {
return theViewYouWant
} else {
return defaultView
}
}
non riesco a ricordare come ignorare getter in Objective-C, quindi se qualcuno vuole inviare che Io modificare la risposta.
qui è l'obiettivo C
- (UIView *)preferredFocusedView
{
if (someCondition) {
// this is if your menu is a tableview
NSIndexPath *ip = [NSIndexPath indexPathForRow:2 inSection:0];
UITableViewCell * cell = [self.categoryTableView cellForRowAtIndexPath:ip];
return cell;
}
return self.view.preferredFocusedView;
}
nel vostro viewDidLoad o vista è comparso fare qualcosa di simile:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
se si vuole farlo quando si lancia il primo
Sto ottenendo nill per la cella e sto usando collectionview invece di tableview! Qualche idea sul perché sia nulla? –
Qui è un'altra implementazione basata sulla risposta di Slayters sopra. È un po 'più elegante che penso di usare i booleani condizionali.
mettere questo nel vostro viewcontroller
var viewToFocus: UIView? = nil {
didSet {
if viewToFocus != nil {
self.setNeedsFocusUpdate();
self.updateFocusIfNeeded();
}
}
}
override weak var preferredFocusedView: UIView? {
if viewToFocus != nil {
return viewToFocus;
} else {
return super.preferredFocusedView;
}
}
Poi da utilizzare nel codice
viewToFocus = myUIView;
questo è stato dichiarato obsoleto in iOS 10. il suggerimento utilizzando preferredFocusEnvironments – nyxee
@ risposta s' elu5ion, ma in Objective-C prima dichiarare:
@property (nonatomic) UIView *preferredView;
Impostare questi metodi:
-(void)setPreferredView:(UIView *)preferredView{
if (preferredView != nil) {
_preferredView = nil;
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
[self.view addLayoutGuide:focusGuide];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self setNeedsFocusUpdate];
[self updateFocusIfNeeded];
}
_preferredView = preferredView;
}
- (UIView *)preferredFocusedView {
if (_preferredView) {
return _preferredView;
}
return self.view.preferredFocusedView;
}
Ecco un bel po 'di Swift frammento 2 copia/incolla:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
usare in questo modo:
updateFocus(to: someAwesomeView)
per IOS 10 si dovrebbe utilizzare preferredFocusEnvironments invece di preferredFocusedView.
Nell'esempio seguente se si desidera concentrarsi su btnEnglish, vedere il codice riportato di seguito.
@IBOutlet weak var btnEnglish:UIButton!
override var preferredFocusEnvironments : [UIFocusEnvironment] {
//condition
return [btnEnglish]
}
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
}
Questa dovrebbe essere la risposta accettata ora poiché 'preferredFocusedView' è in fase di svalutazione. –
- 1. Come forzare una messa a fuoco su un controllo nei moduli di Windows
- 2. Rimuovere la messa a fuoco programmaticamente?
- 3. Animazione/zoom di una vista personalizzata focalizzata in tvOS
- 4. Come posso aprire una finestra NSW e avere la finestra selezionata e messa a fuoco?
- 5. tvos: aspetto di messa a fuoco di UITextView come film App
- 6. Come disabilitare la messa a fuoco immediata in TextInputLayout?
- 7. Come rendere la messa a fuoco di un UIView utilizzando il motore di messa a fuoco su Apple TV
- 8. Determinazione della messa a fuoco in SWT
- 9. Terminale OSX - Cambia messa a fuoco applicazione
- 10. AngularJS: perdita di messa a fuoco forzata
- 11. Come impostare la messa a fuoco automatica solo in xaml?
- 12. Messa a fuoco tastiera rubata da Flash
- 13. Impedire la messa a fuoco delle finestre Python
- 14. Come delegare l'evento di messa a fuoco?
- 15. Come posso forzare cv.glmnet a non eliminare una variabile specifica?
- 16. Messa a fuoco manuale in camera2, android
- 17. Messa a fuoco della tastiera e messa a fuoco logica in WPF
- 18. Disabilita la messa a fuoco automatica della webcam in Linux
- 19. DataGridView - Mette a fuoco una cella specifica
- 20. Messa a fuoco ContentEditable in Chrome/Safari
- 21. La messa a fuoco automatica di Android quando le modalità di messa a fuoco automatica continua non sono supportate
- 22. Come modificare automaticamente la messa a fuoco sull'elemento successivo dell'elenco
- 23. UITextField perde l'evento di messa a fuoco
- 24. Come impostare la messa a fuoco di WATIR su una nuova finestra
- 25. Fotocamera Android: messa a fuoco dell'obiettivo fissa
- 26. Spinner: messa a fuoco sul primo elemento
- 27. Spinner non viene messa a fuoco
- 28. WPF e messa a fuoco iniziale
- 29. Google Goggles Fotocamera messa a fuoco automatica
- 30. tvOS: forza un pulsante per mettere a fuoco
Grazie. Stavo pensando di farlo in questo modo, ma sembra davvero disordinato mettere tutte queste "condizioni" dappertutto. Sarebbe molto più semplice se potessi semplicemente impostarePreferredFocusedView ... –
Ma, aspetta. Come funziona quando voglio cambiare lo stato attivo su un altro viewcontroller? –
Sono d'accordo. Spero che lo aggiungeranno. Inoltre, per evitare tutto il 'someCondition's, ho aggiunto una proprietà' viewToFocus' 'UIView' al mio viewController. Poi nel getter, controllo se quella vista non è nulla e la restituisco. Altrimenti restituisci la vista predefinita. – Slayter