【iOS 10】Today Extension (Widget) の高さを調節する


※本記事は、一般に公開されている情報 を元に作成しています
※図は What's New in iOS 10 - Overview - iOS Human Interface Guidelines より引用しています

これは何

iOS 10から NCWidgetDisplayMode という概念が追加されました。これに伴い、Today Extension(以下Widget)の高さを調節する方法も変わっています。何も対応しないとOSが決めた高さに固定されます。
この記事ではiOS 10で Widget の高さを調節する方法を解説します。

検証環境

  • Xcode 8 beta 4

NCWidgetDisplayModeとは

公式ドキュメントには次のように書かれています。

The modes that can be toggled between when the More button is activated within a widget running in iOS.

"More button" というのは下図の "Show More" ボタンのことを指しているものと思われます。

このボタンが押される度に NCWidgetDisplayMode が切り替わります。値は

  • Compact (default)
  • Expanded

が用意されています。

高さを調節する

NCWidgetDisplayModeExpanded をセットします。こうすることで Widget に「Show More」ボタンが現れ、ユーザが高さを調節することができるようになります。(iOS 10未満のデバイスで実行するとクラッシュするので注意)

override func viewDidLoad() {
    super.viewDidLoad()
    self.extensionContext?.widgetLargestAvailableDisplayMode = NCWidgetDisplayMode.Expanded
}

次に widgetActiveDisplayModeDidChange を実装します。このメソッドは名前の通り NCWidgetDisplayMode が変更される度に呼ばれます。

func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize){
    if (activeDisplayMode == NCWidgetDisplayMode.Compact) {
        self.preferredContentSize = maxSize;
    }
    else {
        self.preferredContentSize = CGSize(width: 0, height: 200);
    }
}

activeDisplayMode に現在のモードが渡ってくるので、それによって Widget のサイズを調整します。設定できる最大サイズは maxSize で取得できます。

これで Widget の高さが調節できました

参考リンク