焦点引擎可以保持被解雇的观点

时间:2017-04-12 08:21:22

标签: ios swift tvos

我想对我在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按钮,则会显示

GO,如下所示: storyboard

如果我们提交ViewController,我们会使用滑动关注其正确的项目,然后使用菜单按钮关闭ViewController,控制台会打印:

ViewController deinit
FocusableView deinit
FocusableView deinit

现在,如果我们提出ViewController,我们会在遥控器右侧使用触摸关注其正确的项目,然后我们使用菜单按钮关闭ViewController,控制台只打印:

ViewController deinit

只有再次触摸遥控器时,才会发布可聚焦视图。

记忆图

如果我们在使用触摸来聚焦项目时查看内存图表,那么可聚焦项目似乎会被一个神秘的_UIFocusMapSnapshot的强引用所保留: memory graph

如果一个视图有一个AVPlayerLayer,播放器的声音会在其视图被解除时继续播放,这可能会非常令人不安。

更新

Apple最近回答了我的错误报告:这是自tvOS 11测试版以来修复的UIKit错误

0 个答案:

没有答案