tvOS 关于Apple TV开发的注意事项

前言

hihi,勇敢的小伙伴儿们大家好,八月,来更博客了~tvOS开发的一些注意事项分享给大家~

正文

有能力的小伙伴儿们可以去官方文档了解一下App Programming Guide for tvOS

接下来说几个tvOS的特别之处。

1.Apple tvOS引入了一下几个特有的框架。

  • TVMLJS。描述了C/S应用中用来加载TVML页面的JavaScript接口。见《TVJS Framework Reference》。
  • TVMLKit。提供一种整合JavaScript和TVML的方法。见《TVMLKit Framework Reference》。
  • TVServices。描述了如何为应用添加顶部扩展《TVServices Framework Reference》。

2.资源限制

Apple TV上的应用没有持久化的本地存储。

There's an inconsistency regarding the Documents folder: you can create files in it when you run your app in the Simulator. But on the actual Apple TV, it just fails.

虽然可以短暂存储在Caches或Temporary文件夹下,但是依然会被系统删除。

You can write data to the Caches directory and the data should stay there as long as your app is running. But when your app exits, that data could be deleted by the system, so be prepared for it to be gone when your app launches again.

这意味着每个应用都应该将数据存放在iCloud,并且通过一种用户体验较好的方式将它们获取到。

可以用NSUserDefaults存储一些参数,但是不可以存储很大的数据,最大也就512k。

NSUserDefaultsSizeLimitExceededNotification is posted on the main queue when more data is stored in user defaults than is allowed. Currently there is no limit for local user defaults except on tvOS, where a warning notification will be posted at 512kB, and the process terminated at 1MB. For ubiquitous defaults, the limit depends on the logged in iCloud user.

除了缺乏本地存储,Apple TV应用的大小也被限制在200MB。如果一个应用的大小超过了限制,就需要使用按需加载的方式将它们打包。知道什么时候加载以及如何价值新的资源对开发一款成功的应用非常重要。更多关于按需加载资源的信息,见《On-Demand Resources Guide》。

3.焦点引擎

我的个人理解是,tvOS不像iOS是电容屏的设备,可以用手指精准触碰到需要交互的视图上的操作,而是使用遥控器的方式进行焦点的移动,所以有了焦点的概念,例如UICollectionViewCell上的Button等。

只有焦点引擎能够显式的更新焦点,以为着系统并没有提供API来直接在某个方向操作和移动焦点,只有在用户发送移动事件、系统和应用请求更新的时候,焦点引擎才会更新焦点。更多关于焦点的更新,见《Updating Focus Programmatically》。

如果焦点引擎找到了一个可以接受焦点的视图,比如Cell或Button,它会通过shouldUpdateFocusInContext:代理方法给应用提供一个评估是否移动焦点的机会。焦点引擎按前一个和下一个的顺序通知每个焦点环境(先通知前一个视图,然后下一个视图,最后通知它们的父视图)。只要有一个视图返回NO,这次移动就会被取消。更多关于焦点环境的信息,见《UIFocusEnvironmentProtocol Reference》。

系统产生的焦点更新动作

在许多环境下,必要的时候UIKit会自动更新焦点。下面是焦点自动更新的一些示例:

  • 焦点视图被移除。
  • UITableView或UICollectionView重新加载数据。
  • 弹出一个新的视图控制器。
  • 用户按Menu按钮返回。

在视图控制器中支持焦点

因为UIViewController相应UIFocusEnvironment,自定义视图控制器可以覆盖UIFocusEnvironment中的代理方法来实现自定义焦点的行为。

自定义视图控制器:

  • 覆盖preferredFocusedView来明确焦点默认从哪里开始。
  • 覆盖shouldUpdateFocusInContext:定义焦点如何移动。
  • 覆盖didUpdateFocusInContext:withAnimationCoordinator:响应焦点的更新时机并且改变应用的状态。

视图控制器可以通过调用setNeedsFocusUpdate请求焦点引擎来重置焦点到当前的preferredFocusedView上。注意,只有当该视图控制器包含一个已经获取焦点的视图时,setNeedsFocusUpdate才会起作用。

在CollectionView和TableView中支持焦点

使用UICollectionView和UITableView的时候,我们通过代理对象自定义焦点行为。这个模式同事也用于基于焦点的界面的实现。UITableViewDelegate和UICollectionViewDelegate协议定义了UIFocusEnvironment协议中相同的方法,但是只能给UITableView和UICollectionView使用。

在UICollectionView和UITableView中支持焦点的技巧:

  • 使用UICollectionViewDelegate中的collectionView:canFocusItemAtIndexPath:或者UITableViewDelegate中的tableView:canFocusRowAtIndexPath:方法表明一个Cell是否可以获取焦点。这与在自定义视图中重写canBecomeFocused方法的作用一样。
  • 使用UICollectionView和UITableView中的remembersLastFocusedIndexPath属性表示离开焦点离开后,再次获取焦点时是否应该停留在最后一次的位置。

这里可以参考我之前的一篇博客tvOS UICollectionViewCell上添加UIButton改变焦点Focus理解。

在自定义视图中支持焦点

UIViewController、UIView都实现了UIFocusEnvironment协议,因此所有在在视图控制器中支持焦点提到的都可以在自定义视图中使用。因为视图能够获取焦点,所以实现自定义视图的焦点行为时,还需要考虑一些额外的东西:

  • 如果自定义视图需要能够获取焦点,重写canBecomeFocused方法,并返回YES(默认返回NO)。视图可以是一直都能够获取焦点或者只能在一些条件下获取焦点。例如UIButton在禁用状态是不能获取焦点的。
  • 如果一个视图需要将焦点重定向到领悟一个焦点(例如子视图),需要重写preferredFocusedView。
  • 重写didUpdateFocusInContext:withAnimationCoordinator:响应焦点改变事件,并更新程序状态。

焦点相关动画

当焦点发生改变的时候,获取焦点的视图执行动画,而前一个视图动画进入无焦点状态。与应用中的其它动画不一样的是,UIKit会调整焦点动画的时长和动画曲线来达到某种系统级的行为。例如,当焦点快速移动的时候,动画的时长会虽用户的移动而加速。

UIKit为支持焦点的视图类提供了系统定义的焦点动画。使用UIKit的内置类UIFocusAnimationCoordinator和addCoordinatedAniamtions:completion:方法可以为系统定义的行为创建动画。

添加到协调器的动画可以在获取焦点或者失去焦点的时候运行(不是同时),这取决于提供给协调器的焦点环境。获取焦点的视图和失去焦点的视图共同的父视图或者焦点获取视图的父视图,在焦点动画执行时,运行自己的动画。而失焦视图的父视图在失去焦点的时候执行动画。

- (void)didUpdateFocusInContext:(UIFocusUpdateContext *)context withAnimationCoordinator:(UIFocusAnimationCoordinator *)coordinator
{[super didUpdateFocusInContext:context withAnimationCoordinator:coordinator];if (self == context.nextFocusedView) {[coordinator addCoordinatedAnimations:^{// focusing animations} completion:^{// completion}];} else if (self == context.previouslyFocusedView) {[coordinator addCoordinatedAnimations:^{// unfocusing animations} completion:^{// completion}];}
}

注意:有许多原因会导致视图不能获取焦点,下面列举了一些例子(但不是全部):

  • 视图的canBecomeFocused方法返回NO。
  • 视图的hidden属性被设置为YES。
  • 视图的alpha属性被设置为0。
  • 视图被设置为不能接受用户交互。
  • 视图被其它视图覆盖。

UIKit为UIView提供了一个隐藏的方法_whyIsThisViewNotFocusable来帮助测试上面提到的几种情况。这个方法只在调试器中有用,并且会将可能的原因打印出来。

(lldb) po [(UIView *)0x148db5234 _whyIsThisViewNotFocusable]
ISSUE: This view has userInteractionEnabled set to NO. Views must allow user interaction to be focusable.
ISSUE: This view returns NO from -canBecomeFocused.
(lldb) po [(UIView *)0x14b644d70 _whyIsThisViewNotFocusable]
ISSUE: One or more ancestors are not eligible for focus, preventing this view from being focusable. Details::ISSUE: This view has userInteractionEnabled set to NO. Views must allow user interaction to be focusable.

在UINaviGationController栈中的vc顶部的控件无法获得焦点,可能是UINavigationBar挡住了控件。

4.界面

 tvOS Human Interface Guidelines

触摸板事件:滑动,点击,轻触。

Apple TV上的所有图片按@1x分辨率提供。

每个应用必须提供一个小尺寸和大尺寸图标。应用图标必须呈递两种尺寸,两者长宽比相同。

小尺寸图标——这个尺寸的图标在Apple TV主屏上使用。

实际尺寸:400px by 240px

安全区域尺寸:370px by 222px

非聚焦态尺寸:300px by 180px

聚焦态尺寸:370px by 222px

大尺寸图标——这个尺寸的图标在App Store使用。

尺寸:1280px by 768px

大尺寸图标应照搬小尺寸图标的设计。尽管大尺寸图标与小图标使用不同,它仍然是你的应用图标,应该在外观与小图标相匹配。

应用图标安全区域模板能够帮你把内容放在合适位置

顶部展区(Top Shelf)图片

最低要求:每个应用至少提供单张顶部展区静态图——当应用在主屏最上面一行且被选中聚焦时使用。

顶部展区静态图 尺寸:1920px by 720px

启动图像 尺寸:1920px by 1080px 

标签栏 Tab Bars 高度:140px

 

 

感谢原文:TVOS tips


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部