在我的tvOS应用程序中,我有一个带有3个viewControllers的TabBarController。我想要做的是当我切换到下一个viewController时自动隐藏/更改tabBar的焦点。
我在这里看到了一些帖子,因此建议在tabBar上更改alfa,但是我希望有一个上滑动画,就像在viewController中将焦点更改为某些内容时一样。
非常感谢任何形式的帮助。
答案 0 :(得分:1)
正如Charles所说..在派生的UITabBarController中有这样的东西:
var focusOnChildVC : Bool = false {
didSet {
self.setNeedsFocusUpdate()
}
};
override weak var preferredFocusedView: UIView? {
get {
let v : UIView?;
let focused = UIScreen.mainScreen().focusedView
//A bit of a hack but seems to work for picking up whether the VC is active or not
if (focusOnChildVC && focused != nil) {
v = self.selectedViewController?.preferredFocusedView
} else {
//If we are focused on the main VC and then clear out of property as we're done with overriding the focus now
if (focusOnChildVC) {
focusOnChildVC = false
}
v = super.preferredFocusedView;
}
return v
}
}
答案 1 :(得分:0)
下面描述的解决方案的基本思想是子类Enumerator
并有选择地使用UITabBarController
的{{1}}实现或者返回super
的{{1}}实现{ {1}}设置触发焦点更新的weak var preferredFocusedView: UIView? { get }
并设置控制selectedViewController?.preferredFocusView
实现的标志。
更详细地说,子类didUpdateFocusInContext(_:withAnimationCoordinator:)
并覆盖NSTimer
。在您的实现中(确保调用preferredFocusView
实现),您可以检查上下文并确定UITabBarController
属性的后代视图是didUpdateFocusInContext(context: UIFocusUpdateContext, withAnimationCoordinator coordinator: UIFocusAnimationCoordinator)
还是super
(并且tabBar
不是后代。)
如果标签栏获得焦点,您可以在隐藏标签栏之前创建nextFocusedView
。如果标签栏在计时器触发之前失去焦点,则使其无效。如果计时器触发,请拨打previousFocusedView
,然后拨打nextFocusedView
。
要使其工作所需的最后一部分是在设置计时器时设置为NSTimer
的标志。然后,如果标记为setNeedsFocusUpdate()
,并且updateFocusIfNeeded()
返回true
,则需要覆盖weak var preferredFocusedView: UIView? { get }
并调用super
实现。
答案 2 :(得分:0)
您可以在UITabBarController子类中做到这一点:
#pragma comment(lib, "NtosKrnl.lib")