2016-05-03 6 views
1

Ich habe mehrere Steuerelemente auf meinem Bildschirm. Eine Sammlungsansicht rechts oben, dann eine Schaltfläche in der linken Mitte und neben der Schaltfläche habe ich eine andere Sammlungsansicht. Bitte beachten Sie das beigefügte Bild dafür enter image description hereFokus mit mehreren Steuerelementen auf Apple TV verwalten

Ich bin in der Lage, den Fokus von der Schaltfläche zur unteren Sammlung zu verschieben und umgekehrt.


     focusGuide.preferredFocusedView = self.btn 
     self.view.addLayoutGuide(self.focusGuide) 

     self.focusGuide.topAnchor.constraintEqualToAnchor(collectionViewHeader.topAnchor).active = true 
     self.focusGuide.bottomAnchor.constraintEqualToAnchor(collectionViewBottom.topAnchor).active = true 
     self.focusGuide.leadingAnchor.constraintEqualToAnchor(collectionViewBottom.leadingAnchor).active = true 
     self.focusGuide.widthAnchor.constraintEqualToAnchor(collectionViewBottom.widthAnchor).active = true 

und in didUpdateFocusInContext: Ich habe einen Schwerpunkt Führung für die gleichen wie unten erstellt, ich habe schreiben:


    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) { 
     super.didUpdateFocusInContext(context, withAnimationCoordinator: coordinator) 

     guard let nextFocusedView = context.nextFocusedView else { return } 

      if(nextFocusedView .isKindOfClass(bottomCell)) { 
      self.focusGuide.preferredFocusedView = self.btn 
     } else { 
      self.focusGuide.preferredFocusedView = self.collectionViewBottom 
     } 
    } 

Aber ich bin nicht in der Lage Fokus von Taste nach oben Sammlung Ansicht zu bewegen . Ich brauche möglicherweise mehrere Fokus-Guide dafür, aber ich weiß nicht, was dort kommen soll. Kann mir jemand dabei helfen?

Danke

Antwort

0

ich ähnliche Probleme in vielen Teilen meiner UI hatte so am Ende eine benutzerdefinierte Ansicht definieren, erstellen größere Bereiche des Bildschirms, die Gruppen von fokussierbarem Steuerelement darstellen. Da ich diese größeren Bereiche so nutze, dass sie leere Bereiche abdecken, die keine Steuerelemente enthalten, fangen sie die Fokusbewegung ab und übertragen sie auf die Steuerelemente innerhalb des Bereichs, unabhängig von der vertikalen oder horizontalen Ausrichtung mit dem ursprünglichen Steuerelement, von dem aus der Fokus gestartet wurde.

Dies ist die benutzerdefinierte Ansicht. Sie verwenden es, indem Sie ein oder mehrere Steuerelemente in IB platzieren.

Beachten Sie, dass es zusätzliche Funktionen wie das Erzwingen des Fokus auf ein bestimmtes Steuerelement hat, ohne preferredFocusView überschreiben zu müssen, aber Sie können diese löschen, wenn Sie sie nicht benötigen).

class FocusGroup : UIView 
{ 
    weak private var nextFocusView:UIView? = nil 
    weak var initialView:UIView?   = nil 
    var captureFocus:Bool     = false 

    func focusOnView(view:UIView, now:Bool=false) 
    { 
     if not(view.isDescendantOfView(self)) 
     || view === self 
     { return } 

     nextFocusView = view 
     setNeedsFocusUpdate() 
     if now { updateFocusIfNeeded() } 
    } 

    func resetFocus(now now:Bool=false) 
    { 
     nextFocusView = nil 
     setNeedsFocusUpdate() 
     if now { updateFocusIfNeeded() } 
    } 

    override func canBecomeFocused() -> Bool 
    { 
     if nextFocusView != nil { return true } 
     if containsFocus { return false }  
     return firstFocusableSubView() != nil 
    } 


    func firstFocusableSubView() -> UIView? 
    { 

    return findSubview({ 
          $0.canBecomeFocused() 
          && $0.userInteractionEnabled 
          && $0.visible 
          && (not($0 is UIButton) 
           || ($0 as! UIButton).enabled) 
         }) 
    } 


    override var preferredFocusedView: UIView? 
    { 
     if let viewToFocus = (nextFocusView ?? initialView) ?? firstFocusableSubView() 
     { 
     return viewToFocus 
     } 
     return nil 
    } 

    override func shouldUpdateFocusInContext(context: UIFocusUpdateContext) -> Bool 
    { 
     // when capturing focus, prevent navigation outside of grouped subviews 
     if captureFocus 
     && containsFocus 
     && context.previouslyFocusedView!.isDescendantOfView(self) 
     && (
      context.nextFocusedView == nil 
      || context.nextFocusedView === self 
      || not(context.nextFocusedView!.isDescendantOfView(self)) 
     ) 
     { return false } 

     return true 
    } 

    override func didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator) 
    { 
     // give focus to specific view as requested 
     if nextFocusView != nil 
     { 
     if context.nextFocusedView === nextFocusView 
     || not(nextFocusView!.canBecomeFocused()) 
     { nextFocusView = nil } 
     return 
     }  
    } 

} 
Verwandte Themen