2016-05-03 1 views
1

私は画面に複数のコントロールを持っています。右上のコレクションビュー、次に左中央のボタン、そしてボタンのほかに、別のコレクションビューがあります。添付画像を参照してください。enter image description hereApple TVの複数のコントロールでフォーカスを管理する

ボタンをボトムコレクションビューに移動することができます。その逆もできます。


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

しかし、私はトップコレクションビューにボタンからフォーカスを移動することはできませんよ:、私は書き込みを持っている:


     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 

とdidUpdateFocusInContext中:私は以下のように同じのためのフォーカスガイドを作成しました。私はこのために複数のフォーカスガイドが必要かもしれませんが、私はそこに何が来るべきか分かりません。誰かが私にこれを助けることができますか?

は、私は私のUIの多くの部分で同様の問題を抱えていた

答えて

0

はそうフォーカス可能なコントロールのグループを表す画面の大きな領域を作成するためにカスタムビューを定義することになった、ありがとうございました。コントロールを持たない空の領域をカバーするようにこれらの大きな領域を設定するので、フォーカス移動を傍受し、フォーカスが始まった元のコントロールと垂直または水平に配置されていない領域内のコントロールにフォーカスを移します。

これはカスタム表示です。 IBの中に1つまたは複数のコントロールを配置することによって使用します。

preferredFocusViewをオーバーライドすることなく、特定のコントロールにフォーカスを強制するなどの追加機能がありますが、必要がない場合はドロップできます。

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

} 
関連する問題