我们公司正在使用纵向电视连接到运行我们自己的自定义应用程序的Apple TV作为状态板。这纯粹是一个内部的,被黑客攻击的应用程序 - 不用担心发送到App Store。
为了避免事物被侧向渲染,我们有一个基类视图控制器在视图上执行90度CGAffineTransform(并且项目中的所有其他视图控制器都从此基类继承):
class PortraitViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.transform = CGAffineTransform(rotationAngle: -1*CGFloat.pi/2)
}
}
这非常适合显示图像,文本,视频,自定义UI控件等。但是,焦点引擎不会随着视图一起旋转,并且因为它希望电视仍然以横向显示,Apple TV遥控器手势与我们想要的结果相差90度。这是一个例子:
在这里,我们希望在遥控器上向右/向左滑动以在两个片段之间移动分段控件的焦点。但是因为Apple TV认为它是以横向模式显示的,所以它认为分段控制是垂直定向的,向上/向下滑动会移动分段的焦点。
有没有人知道是否有办法说服焦点引擎不要在视图旁边旋转,或者是否有另一种方式在纵向模式下显示视图而不旋转视图?
答案 0 :(得分:0)
这太糟糕了,但是我想实现自己想要的唯一方法就是完全接管聚焦系统。因此,使根窗口/视图具有焦点可劫持所有输入事件,侦听原始输入事件,并根据需要通过原始触摸/按下事件管理自己的焦点系统。您仍然可以使用preferredFocusEnvironments + setNeedsFocusUpdate来利用所有系统UI +动画来进行聚焦/非聚焦元素,但是将需要完全掌握如何根据用户输入转移焦点以及如何转发焦点更新提示以实现视差效果。
在UIApplication或UIWindow级别覆盖sendEvent(_ event:UIEvent),以在将输入事件传递到系统之前将其转换为纵向坐标,这在纸面上似乎是一个好主意,并且几乎可以正常工作。除非无法以编程方式生成或修改触摸事件。既然您不关心App Store的可行性,但是也许您可以破解一种以编程方式生成或修改触摸事件的方法?子类化UITouch / UIPress?使用performSelector调用私有或未记录的方法?