[tvOS]ホーム画面にシェルフを表示する

#シェルフ
棚、という意味

#シェルフの表示条件
一番上の段にアイコンが置いてあることが条件となる。

![Simulator Screen Shot 2015.10.26 20.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/24979/36d5a2b8-95dd-eefb-f9af-73d3ac79a386.png)

一番上にアイコンがある例

![Simulator Screen Shot 2015.10.26 20.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/24979/e8877ec9-2428-556e-079d-cad0bf2203c2.png)

一番上段にアイコンが無いと、シェルフは表示されない。

#シェルフの立ち位置
Keyboard Extensionのようにエクステンションの扱いになる。

#プロジェクトに追加する
<img width="515" alt="スクリーンショット 2015-10-26 20.55.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/374f5709-0197-7e71-89a0-336c5908c3af.png">
NewからTargetを選ぶ

<img width="764" alt="スクリーンショット 2015-10-26 20.47.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/24979/02e17056-ede7-58ff-5eb7-92a801b522de.png">
TVServiceExtensionを選択して追加

#ServiceProvider.swift
ターゲットにTVServiceExtensionを追加するとServiceProvider.swiftがプロジェクトに追加される。
ServiceProvider.swiftはTVTopShelfProviderによっていくつかの機能が与えられたNSObjectのサブクラス。

#topShelfStyle:TVTopShelfContentStyle
ここではシェルフのスタイルを返す
InsetとSectionedが選べる。
##Sectioned
![Simulator Screen Shot 2015.10.26 20.51.38.png](https://qiita-image-store.s3.amazonaws.com/0/24979/875fe84b-2dbb-fa82-b963-14dcaac089f4.png)
##Inset
![Simulator Screen Shot 2015.10.26 21.03.08.png](https://qiita-image-store.s3.amazonaws.com/0/24979/f9529b33-7aa2-d919-630a-1746536e1c32.png)

この違いは画像の大きさではなく、セクションのタイトルが表示されているか否かである。

#topShelfItems: [TVContentItem]
ここでは表示するコンテンツを返す。

```swift

    var topShelfItems: [TVContentItem] {
        let contentIdentifier = TVContentIdentifier(identifier: "sample", container: nil)
        let contentItem = TVContentItem(contentIdentifier: contentIdentifier!)!
        let imageURL = NSBundle.mainBundle().URLForResource("Unknown", withExtension: "jpg")
        contentItem.imageURL = imageURL
        return [contentItem]
    }

```

![Simulator Screen Shot 2015.10.26 21.44.27.png](https://qiita-image-store.s3.amazonaws.com/0/24979/ef408411-1a2c-7e1c-d6b9-8e73f486235d.png)

imageURLには`https~`から始まるURLも指定できる

```swift

    var topShelfItems: [TVContentItem] {
        let contentIdentifier = TVContentIdentifier(identifier: "sample", container: nil)
        let contentItem = TVContentItem(contentIdentifier: contentIdentifier!)!
        let imageURL = NSURL(string: "https://placeimg.com/640/480/any")
        contentItem.imageURL = imageURL
        return [contentItem]
    }

```

![Simulator Screen Shot 2015.10.26 21.48.24.png](https://qiita-image-store.s3.amazonaws.com/0/24979/239ba424-290a-f666-7502-364bcfd0bc01.png)

##imageShape
imageShapeを指定すると、ポスターや四角などの大きさに画像をコンテンツを変更できる。
なおInsetの場合はExtraWideのみ、Sectionedの場合はPoster,Square,HDTVが選べる。

##topShelfItems
TVContentItemは一枚のコンテンツとして以外にもコンテンツを束ねる役割もある。

```swift
    var topShelfItems: [TVContentItem] {
        let contentIdentifier = TVContentIdentifier(identifier: "sample", container: nil)
        let contentItem = TVContentItem(contentIdentifier: contentIdentifier!)!
        let imageURL = NSURL(string: "https://placeimg.com/640/480/any")
        contentItem.imageURL = imageURL
        contentItem.imageShape = .Poster
        let group = TVContentItem(contentIdentifier: contentIdentifier!)!
        group.topShelfItems = [contentItem,contentItem,contentItem,contentItem]
        group.title = "画像群"
        return [group]
    }
```

![Simulator Screen Shot 2015.10.26 22.00.15.png](https://qiita-image-store.s3.amazonaws.com/0/24979/bafedf10-f541-b33a-6962-4672b806a2db.png)