web-dev-qa-db-ja.com

iOS 9アプリで静的UIApplicationShortcutItemのカスタムアイコンを指定するにはどうすればよいですか?

現在、3D Touchを使用してiOS 9アプリのホーム画面クイックアクションを実装しています。定義されたUIApplicationShortcutIconType列挙からの既存のシステムアイコンを使用して、いくつかのアクションがあります。

例:

<dict>
    <key>UIApplicationShortcutItemIconType</key>
    <string>UIApplicationShortcutIconTypeSearch</string>
    <key>UIApplicationShortcutItemTitle</key>
    <string>Search for Parking</string>
    <key>UIApplicationShortcutItemType</key>
    <string>SEARCH</string>
</dict>

ただし、アクションの1つでは、カスタムアイコンを使用します。 UIApplicationShortcutItemIconType文字列を画像アセットの名前に置き換えようとしましたが、うまくいきません。

UIApplicationShortcutIcon.iconWithTemplateImageName()を使用して動的アクションを実行するのは簡単ですが、このアクションは静的である必要があります。

28
Chris Allwein

UIApplicationShortcutItemIconTypeキーを使用する代わりに、UIApplicationShortcutItemIconFileキーに置き換えてから、画像ファイルまたはImageAssetの名前を指定します。

このような:

<dict>
    <key>UIApplicationShortcutItemIconFile</key>
    <string>MyCustomImageName</string>
</dict>

残りのキーは元のままにすることができます。

37
Chris Allwein

UIApplicationShortcutItemIconFileをキーとして使用し、イメージファイルの名前(ファイル拡張子の有無にかかわらず)を文字列として使用します。たとえば、「lightning.png」という名前の画像を使用して、Info.plistに次を追加します...

<key>UIApplicationShortcutItems</key>
<array>
    <dict>
        <key>UIApplicationShortcutItemIconFile</key>
        <string>lightning</string>
        <key>UIApplicationShortcutItemTitle</key>
        <string>Search for Parking</string>
        <key>UIApplicationShortcutItemType</key>
        <string>SEARCH</string>
    </dict>
</array>

画像は、プロジェクトツリーまたはAssets.xcassetsに保存できます。 Assets.xcassetsに画像を保存する場合、セットにファイル名とは異なる名前を付ける場合は、画像セット名を使用します。

画像ファイルは、PNG(透明にする場合)、正方形、単色、35x35ピクセルである必要があります。マルチカラー画像には、基本的に黒のオーバーレイが表示されます。

上記の基準を満たすテスト画像は次のとおりです。

lightning.png with transparent background 35x35px

この画像を「lightning.png」として保存し、プロジェクトツリーにドラッグして、Info.plistファイルで上記のコードを使用します。

Info.plistをソースコードとして編集するのが苦手な人のために、プロパティリストでネイティブに行う場合の上記の外観は次のとおりです。

Info.plist

これらのショートカットをコードに添付するには、AppDelegate.Swiftで行います。以下を追加します。

func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) {

    if shortcutItem.type == "SEARCH" {
        print("Shortcut item tapped: SEARCH")
        // go to SEARCH view controller
    }

}

UIApplicationShortcutItemTypeの規則はすべて大文字ではなく(例:「SEARCH」)、バンドル識別子をプレフィックスとして使用することに注意してください:

com.myapps.shortcut-demo.search
24
Justin Vallely