2015-11-23 9 views
5

私は6行の高い説明ラベルを実装しようとしており、フォーカスが必要です。理想的には、UILabelクラスを拡張してカスタムコンポーネントを作成することを意味します。私はcanBecomeFocusedと​​を実装してみましたが、私のUILabelは焦点を当てていないようです。UILabelをフォーカス可能かつタップ可能にする(tvOS)

また、UILabelをUIButtonに置き換えようとしましたが、ボタンは本当にこのようなことに最適化されていません。また、私はbuttonTypeをカスタムからプレーン..に変更する必要があることを意味し、buttonTypeは準備ができたプロパティのようです。

実際には、Apple TV映画アプリでAppleが正確に同じテキストラベルを実装したいと考えています。映画の説明のために、彼らはテキストの数行と "より多くの"を表示するテキストラベルを持っています。フォーカスすると、ボタンのように見えます(周囲の影)、背景色が変わります。タップすると、ムービー全体の説明付きのモーダルウィンドウが開きます。

enter image description here

任意の提案ですか?あるいは、誰かが既にtvOS用のこのカスタムコントロールを実装していますか?それとも、イベントの方がいいですか?これを行うAppleのコンポーネントがあり、私は何かが欠けています。

PS:スウィフトソリューションは自分の質問:)

だから、いくつかのいくつかのビューがすぐにtvOSの「フォーカス可能」であることを思わ答える、[OK]を歓迎:)

答えて

5

なり、他の人はそうするように指示されなければならない。

selectableプロパティを持つUITextViewを使用しましたが、デフォルトではこれらのフォーカス可能なビューの1つではありません。 TextViewの編集を無効にして、UILabelのようにする必要があります。また、現時点では、Interface Builderのselectableプロパティを使用できないバグがありますが、コードから動作します。当然ながら、canBecomeFocused()および​​も実装しなければならなかった。 UITextViewはモーダルビューコントローラを表示できないため、UIViewControllerも渡す必要があります。ベローは私が創造したものです。

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

この回答をお寄せいただきありがとうございます。 https://gist.github.com/Cedrick84/8922a0af730c39c05794 – Cedrick

+0

最近tvOSで変更されたことがあれば、これは動作しなくなるでしょうか?私は何を試みても、TextViewにフォーカスを得ることができません。私はカーネルパニックと@ケドリックの両方のルートをダウンしました。 –

+0

ええ、私はUIImageViewのために同様のものを作って、それを(テーブルやコレクションビューの内部ではなくても)集中させることができましたが、TextViewを動作させることができませんでした。私は上記のすべてのことをやったように、なぜ今は考えていません – c0d3Junk13

1

ただ一つのセルでコレクションビューを使用してセルに変換し、フォーカスがセルに移動したときdidUpdateFocusInContextでセルの背景色を変更、追加。あなたはiTunesのような背景として画像を使用している場合、画像の色を抽出し、セルの背後にある視覚効果の表示のためにそれを使用しようとすることができ、追加のステップとして

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

また、あなたが焦点に

-1

にあなたは、システムのボタンを使用することができ、あなたが希望の色が含まれている画像にストーリーボードで背景画像を設定するようにそれが見えるようにビデオコントローラにcollectionViewに変換を適用することができます

+0

彼はUILabelまたはUITextViewを使いたいと思っています。システムボタンを使うのは恐ろしい解決策です。 –

関連する問題