2015-11-23 15 views
5

Próbuję zaimplementować etykietę z 6 liniami wysokiego poziomu i chcę, aby była możliwa do ogniskowania. Idealnie byłoby to oznaczać rozszerzenie klasy UILabel, aby utworzyć składnik niestandardowy. Próbowałem, wykonując canBecomeFocused i didUpdateFocusInContext, ale mój UILabel nie wydaje się skupić.Ulepsz UILabel i tappable (tvOS)

Próbowałem również zastąpić UILabel z UIButton, ale przyciski nie są tak naprawdę zoptymalizowane dla tego rodzaju rzeczy. Oznaczałoby to również, że muszę zmienić wartość buttonType na fokus z niestandardowego na zwykły .. a buttonType wydaje się być właściwością gotową.

W rzeczywistości chciałbym mieć dokładnie tę samą etykietę tekstową zaimplementowaną przez Apple w aplikacji Apple TV Movies. W opisie filmu znajduje się etykieta tekstowa z kilkoma liniami tekstu i "więcej". Po skupieniu wygląda jak przycisk (cienie dookoła) i zmienia kolor tła. Po dotknięciu otwiera okno modalne z pełnym opisem filmu.

enter image description here

Wszelkie sugestie? A może ktoś już zaimplementował tę niestandardową kontrolę dla tvOS? Albo lepiej - jest tam składnik Apple, który to robi i czegoś mi brakuje.

PS: Swift rozwiązaniem byłoby mile widziane :)

Odpowiedz

5

Ok, odpowiadając na moje własne pytanie :)

Wygląda więc na to, że niektóre niektóre poglądy są "aktywowana" na tvOS out-of-the-box, i inne muszą być poinstruowane, aby to zrobić.

W końcu skończyłem używając UITextView, który ma właściwość selectable, ale domyślnie nie jest jednym z tych widoków z możliwością regulacji. Edytowanie TextView musi być wyłączone, aby wyglądało jak UILabel. Ponadto obecnie występuje błąd, który uniemożliwia korzystanie z właściwości selectable z programu Interface Builder, ale działa z kodu.

Oczywiście, trzeba było również wdrożyć canBecomeFocused() i didUpdateFocusInContext. Będziesz także musiał przekazać UIViewController, ponieważ UITextView nie jest w stanie przedstawić kontrolera widoku modalnego. Osłona jest tym, co stworzyłem.

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

Dzięki za tę odpowiedź, zmodyfikowałem ją trochę dla mojego projektu. https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

Czy ostatnio coś zmieniło się w TVOS, co spowodowałoby, że to nie zadziała? Nadal nie mogę uzyskać TextView, aby uzyskać skupienie bez względu na to, co próbuję. Przeszedłem dwiema ścieżkami przez kernelecynę i @Cedrick. –

+0

Tak, zrobiłem coś podobnego dla UIImageView i udało mi się to skupić (nawet jeśli nie było to w widoku tabeli lub kolekcji), ale nie mogłem uruchomić TextView. Nie mam pojęcia dlaczego teraz, tak jak zrobiłem wszystko, co wyżej wspomniałem. – c0d3Junk13

1

Użyj widoku kolekcji z tylko jedną komórkę i dodać przekształcić do komórki i zmienić kolor tła komórek w didUpdateFocusInContext gdy fokus przenosi się do komórki.

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

Jako dodatkowy etap można spróbować wyodrębnić kolor obrazu, jeśli używasz obraz jako tło, takie jak iTunes i używać za efekt wizualny widzenia za komórkę.

Ponadto można zastosować przekształcić do CollectionView w kartę graficzną, aby wyglądać jak ostre

-1

Można użyć przycisku systemu i ustawić obraz tła w serii ujęć do obrazu, który zawiera kolor chcesz

+0

Chce używać UILabel lub UITextView. Używanie przycisku systemowego to okropne rozwiązanie. –