在 xcode 和 tvos 中,是否可以将 top shelf 图像转换为图像堆栈?

In xcode and tvos, is it possible to convert the top shelf image to an image stack?

在xcode和tvos中,资产目录中的3D视差图标显示为图像堆栈。但所谓的 top shelf image 并非如此。

是否可以在 xcode 中将顶层图像转换为多层图像堆栈?

只有可聚焦的内容才是多层的,然后您需要提供其中的几个。

有 3 种顶层货架类型,但 遗憾的是,其中 none 符合您的需要

您可以在 apple tv human interface guide lines 中阅读更多关于它们的信息。

1) 单张静态顶层货架图片

Provide a visually rich static image. Your app’s static top shelf image is used when dynamic content isn’t provided or is unavailable. Use it as an opportunity to highlight your brand.

Don’t imply interactivity in a static image. The static top shelf image isn’t focusable, so it shouldn't include elements that make it appear interactive.

2) "Dynamic Content Layouts" - "Sectioned Content Row"

这适用于类似于肖像电影海报的内容。这些可以是多层的,但是:

Provide enough content to constitute a complete row. At a minimum, load enough images in a sectioned content row to span the full width of the screen.

3) "Dynamic Content Layouts" - "Scrolling Inset Banner"

这适用于类似于宽屏广告横幅的内容。这些可以是多层的,但是:

A minimum of three images is recommended for a scrolling banner to feel effective.

要制作动态内容,您需要an Apple TV extension. To include a layered image in the content use the Apple Parallax Previewer app加载分层图像中的所有图像,并导出为 LSR 文件。将 LSR 放入 Apple TV 扩展目标中。使用下面的代码创建一个滚动插图(而不是像 RW 教程中那样的分段插图)。然后从应用程序包中读取文件。

请注意,Top Shelf 将 "scroll through" 您的图像,因此您可能需要 3 个相关的分层图像(如上述答案所示)。您可以在 this video.

中查看单个图像的外观(非常蹩脚)
import Foundation
import TVServices

class ServiceProvider: NSObject, TVTopShelfProvider {

    override init() {
        super.init()
    }

    // MARK: - TVTopShelfProvider protocol

    var topShelfStyle: TVTopShelfContentStyle {
        // Return desired Top Shelf style.
        return .inset
    }

    var topShelfItems: [TVContentItem] {
        let v1Ident = TVContentIdentifier(identifier: "V1", container: nil)!
        let v1Content = TVContentItem(contentIdentifier: v1Ident)!
        v1Content.imageURL = Bundle.main.url(forResource: "v1", withExtension: ".lsr")
        // Create an array of TVContentItems.
        return [v1Content]
    }

}