2015-10-20 22 views
12

Mam UICollectionView, który zawiera 12-13 UICollectionViewCells. Mogę łatwo skupić się na UICollectionViewCells i wszystko działa. Istnieje UIButton poza UICollectionView. Jeśli znajduję się w pierwszej komórce lub w drugiej komórce i przesuję palcem w górę, mogę łatwo skupić się na UIButtonie. Kiedy jestem w trzeciej komórce, nie jestem w stanie przenieść fokusu do Uibutton. Jakieś pomysły, co się dzieje?UICollectionViewCell to UIButton Focus in tvOS

enter image description here

Odpowiedz

14

Należy użyć UIFocusGuide że obejmuje UIButton chcesz się skupić. Ustaw UIFocusGuide tak szeroki jak collectionView i wystarczająco wysoki, aby zakryć przycisk. Wybierz preferowany FocusZaznacz przycisk.

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

Dzięki Jess - to doprowadzało mnie do szału. Zauważ, że jeśli masz problem z używaniem go, może to być spowodowane tym, że jeden z twoich punktów kontrolnych jest osadzony w innym widoku. Miałem widok kolekcji wewnątrz widoku przewijania i używając widoku widoku kolekcji, ponieważ mój najwyższy punkt kontrolny nie działał. Zmiana działa na widok przewijania. – Reefwing

+0

Działa jak urok! Dzięki. –

+0

Witam Jess, mam inny problem. Jeśli mam przycisk po prawej zamiast lewej, a jeśli mam tylko jeden widok kolekcji wierszy, nie mogę ustawić widoku kolekcji w trybie ustawiania ostrości. Jakieś rozwiązanie tego? –

2

rozwiązanie Jess Bowers jest prawie tam, ale Xcode mówi UIButton s nie posiada topAnchor mienia i rozwiązanie podane przez Jess nie działa dla mnie.

Dla mnie rozwiązaniem było stworzenie ogromnego widoku o tej samej szerokości co UICollectionView na wierzchu. Widzieć zdjęcie.

enter image description here

Kod będzie to:

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 jest podklasą UIControl, która jest podklasą UIView. https://developer.apple.com/library/tvos/documentation/UIKit/Reference/UIButton_Class/ Zobacz także przykład Apple'a, który używa topAnchor na przycisku. https://developer.apple.com/library/prerelease/tvos/samplecode/UICatalogFortvOS/Listings/UIKitCatalog_FocusGuidesViewController_swift.html –

+0

OK, ale Xcode mówi, że przyciski nie mają topAnchor i niestety rozwiązanie Jess nie działa dla mnie. – SpaceDog

+0

Coś jeszcze jest nie tak. Właśnie wpisałem nazwę mojego przycisku, wpisałem .top i hit escape, a autouzupełnianie pokazało mi topAnchor. Aktualny Xcode. Również rozwiązanie Jess nie działa dla mnie. Badam ramkę przewodnika w punkcie przerwania i wygląda on prawidłowo. Ale nie ma to żadnego wpływu. –

0

Zastosowanie:

przesłanianie słaby var preferredFocusedView: UIView? {Get { powrót segmentedControl }}

0

Jednym z zagadnień byłem licowe zaangażowanych użyciu UINavigationController dla stron docelowych do pchania szczegóły ViewControllers na stosie, gdy element jest zaznaczony.

Umieściłem punkt przerwania w suwaku UIButtonty canBecomeFocused, a użycie tego szybkiego przedłużenia zapytało przycisk, dlaczego nie można ustawić ostrości.

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

Ciągle Otrzymuję następujący błąd podczas próby debugowania ....

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

Przede wszystkim Rozejrzałem się w słowniku, co do cholery zamykającym oznaczało ....

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

Pytanie brzmiało, jaki widok blokuje mój UIButton ???

Szybko rozpakowałem interfejs użytkownika w debugerze wizualnym, a na wierzchu moich UIBULONÓW pojawił się wyraźny widok. Sprawdzając widok, dowiedziałem się, że W przeciwieństwie do iOS, gdzie nagivationBar ma domyślny kolor tła systemu, implementacja tvOS ma wyraźny domyślny kolor. Uświadomiłem sobie, że nie ukryłem paska nawigacji, a w zamian blokowało mi guziki.

Zrobiłem następujące polecenie, a to naprawić wszystkie moje problemy :)

navController.setNavigationBarHidden(true, animated: false) 

Hope this helps !!!

0

Swift 3.0

odpowiedź Jess Bower była ogromna pomoc do mnie & zaoszczędziliśmy sporo czasu.

Oto, co działało z Swift 3 & tvOS 10. Teraz trzeba użyć preferredFocusEnvironments. W 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]