我想对我在tvOS上发现的一种奇怪行为有所了解。
有两种方法可以使用Apple TV遥控器聚焦项目:使用滑动手势或触摸遥控器打击垫的一侧(右侧,左侧,顶部或底部)。
如果我们在解除当前视图控制器之前使用第一个选项来聚焦项目,那么视图控制器和视图控制器的所有视图都将被释放。
但是,如果我们在解除当前视图控制器之前使用第二个选项来聚焦项目,则此视图控制器的所有可聚焦视图似乎都保留在内存中。呈现的视图控制器已发布;不是它的焦点。
只有当我们再次触摸(不再滑动)遥控器的打击垫时,才会释放可聚焦视图。无论我们在应用程序中的哪个位置,此解决方案都能正常运行。
/// A custom focusable view
class FocusableView : UIView {
override var canBecomeFocused: Bool { return true }
override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) {
if context.previouslyFocusedView == self {
backgroundColor = .lightGray
} else if context.nextFocusedView == self {
backgroundColor = .red
}
}
deinit {
print("FocusableView deinit")
}
}
/// The presented view controller
class ViewController: UIViewController {
@IBOutlet private var leftView: FocusableView!
@IBOutlet private var rightView: FocusableView!
deinit {
print("ViewController deinit")
}
}
如果我们选择第一个简单视图控制器的ViewController
按钮,则会显示
如果我们提交ViewController
,我们会使用滑动关注其正确的项目,然后使用菜单按钮关闭ViewController
,控制台会打印:
ViewController deinit
FocusableView deinit
FocusableView deinit
现在,如果我们提出ViewController
,我们会在遥控器右侧使用触摸关注其正确的项目,然后我们使用菜单按钮关闭ViewController
,控制台只打印:
ViewController deinit
只有再次触摸遥控器时,才会发布可聚焦视图。
如果我们在使用触摸来聚焦项目时查看内存图表,那么可聚焦项目似乎会被一个神秘的_UIFocusMapSnapshot
的强引用所保留:
如果一个视图有一个AVPlayerLayer
,播放器的声音会在其视图被解除时继续播放,这可能会非常令人不安。
Apple最近回答了我的错误报告:这是自tvOS 11测试版以来修复的UIKit错误