Siri Remoteのメニューボタンのクリックを処理するカスタムコードを実装しています。メニューボタンを押したときにフォーカスをカスタムメニューに強制的に変更するにはどうすればよいですか?
最後に自分でそれを理解しました。 preferredFocusedView
またはUIView
のUIViewController
プロパティをオーバーライドする必要があります。
Swiftでは、次のように機能します。
func myClickHandler() {
someCondition = true
self.setNeedsFocusUpdate()
self.updateFocusIfNeeded()
someCondition = false
}
override weak var preferredFocusedView: UIView? {
if someCondition {
return theViewYouWant
} else {
return defaultView
}
}
Objective-Cでゲッターをオーバーライドする方法を思い出せないので、誰かが投稿したい場合は、回答を編集します。
IOS 10の場合は、preferredFocusedViewではなく、preferredFocusEnvironmentsを使用する必要があります。
以下の例でbutton
に焦点を当てたい場合は、以下のコードを参照してください。
@IBOutlet weak var button: UIButton!
override var preferredFocusEnvironments: [UIFocusEnvironment] {
return [button]
}
override func viewDidLoad() {
super.viewDidLoad()
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
上記のSlaytersの回答に基づく別の実装を次に示します。条件付きブール値を使用するよりも少しエレガントだと思います。
これをビューコントローラーに入れてください
var viewToFocus: UIView? = nil {
didSet {
if viewToFocus != nil {
self.setNeedsFocusUpdate();
self.updateFocusIfNeeded();
}
}
}
override weak var preferredFocusedView: UIView? {
if viewToFocus != nil {
return viewToFocus;
} else {
return super.preferredFocusedView;
}
}
次に、コードで使用するには
viewToFocus = myUIView;
これがObjective Cです
- (UIView *)preferredFocusedView
{
if (someCondition) {
// this is if your menu is a tableview
NSIndexPath *ip = [NSIndexPath indexPathForRow:2 inSection:0];
UITableViewCell * cell = [self.categoryTableView cellForRowAtIndexPath:ip];
return cell;
}
return self.view.preferredFocusedView;
}
あなたのviewDidLoadまたはビューで次のように表示されました:
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self.view addLayoutGuide:focusGuide];
最初の起動時にそれを実行したい場合
@ elu5ionの答えですが、objective-cで最初に宣言します。
@property (nonatomic) UIView *preferredView;
これらのメソッドを設定します。
-(void)setPreferredView:(UIView *)preferredView{
if (preferredView != nil) {
_preferredView = nil;
UIFocusGuide *focusGuide = [[UIFocusGuide alloc]init];
[self.view addLayoutGuide:focusGuide];
focusGuide.preferredFocusedView = [self preferredFocusedView];
[self setNeedsFocusUpdate];
[self updateFocusIfNeeded];
}
_preferredView = preferredView;
}
- (UIView *)preferredFocusedView {
if (_preferredView) {
return _preferredView;
}
return self.view.preferredFocusedView;
}
ここに素敵な小さなSwift 2コピー/貼り付けスニペットがあります:
var myPreferredFocusedView: UIView?
override var preferredFocusedView: UIView? {
return myPreferredFocusedView
}
func updateFocus(to view: UIView) {
myPreferredFocusedView = napDoneView
setNeedsFocusUpdate()
updateFocusIfNeeded()
}
次のように使用します。
updateFocus(to: someAwesomeView)