`
啸笑天
  • 浏览: 3435013 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

TVOS tips

    博客分类:
  • TVOS
 
阅读更多

酷

App Programming Guide for tvOS

 

 酷

All video playback on Apple TV is based on HTTP Live Streaming and FairPlay Streaming. See About HTTP Live Streaming and FairPlay Streaming Overview. For HTTP Live Streaming authoring specifications, see HLS Authoring Specification for Apple TV.

 

酷

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

 

酷 资源限制

Apple TV上的应用没有持久化的本地存储。这意味着每个应用都应该将数据存放在iCloud,并且通过一种用户体验较好的方式将它们获取到。

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

 酷

 

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

酷

 

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

酷系统产生的焦点更新动作

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

 

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

酷 在视图控制器中支持焦点

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

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

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

 

酷 在CollectionViewTableView中支持焦点

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

在集合视图和表视图中支持焦点的技巧:

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

酷在自定义视图中支持焦点

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:

    <ExampleAncestorView 0x148db5810>:
        ISSUE: This view has userInteractionEnabled set to NO. Views must allow user interaction to be focusable.

 酷

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

 

 酷

[MUX翻译] Apple TV 人机界面指南

 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

 

酷 

Using the Focus Guide to Improve your tvOS Apps

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics