3D Touchでアプリのアイコンぎゅってするとぶおって出てくるやつやってみた

  • 21
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

ミーハーなオタクなので、iPhone6Sをゲットしてやってあの3D Touchでギュッとするとぶおって出てくるやつやりたくなったのでやった

How To?

やり方は2通りあって、Info.plistに書いとくタイプと動的にセットするやつがあるっぽい
plistを弄りたくないオタクとしてはコードでどうにかしたいってので、コードでどうにかした
Dynamic ShortcutItem的な呼ばれかたっぽい?

実装

どこでやるかってと、まぁ当然の如くAppDelegate.swiftでやる
今回は、メイン部分をHomeDynamicShortcutってクラスを作ってそこに逃がした
僕の作ってる学内の履修管理アプリのソースの一部です

AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        if #available(iOS 9.0, *) {
            application.shortcutItems = HomeDynamicShortcut.shortcuts()
        }
        return true
    }
HomeDynamicShortcut.swift
import Foundation
import UIKit

class HomeDynamicShortcut {
    enum ShortcutType: String {
        case Timetable = "Timetable"
        case Board = "Board"
        case NextClass = "NextClass"
    }

    @available(iOS 9.0, *)
    class func shortcuts() -> [UIApplicationShortcutItem] {
        let shortcut1 = UIMutableApplicationShortcutItem(
            type: ShortcutType.Timetable.rawValue,
            localizedTitle: "時間割",
            localizedSubtitle: nil,
            icon: UIApplicationShortcutIcon(templateImageName: "timetableIcon"),
            userInfo: ["shortcutKey": ShortcutType.Timetable.rawValue]
        )

        let shortcut2 = UIMutableApplicationShortcutItem(
            type: ShortcutType.Board.rawValue,
            localizedTitle: "掲示板",
            localizedSubtitle: nil,
            icon: UIApplicationShortcutIcon(templateImageName: "boardIcon"),
            userInfo: ["shortcutKey": ShortcutType.Board.rawValue]
        )
        let now = Timetable.getNow()
        let nextClassWeekDay = now.0
        var nextClassPeriod = now.1
        let timetable = Timetable()
        var nextClass: TimetableData?

        for _ in 0...7 {
            if let data = timetable.get(day: nextClassWeekDay, period: nextClassPeriod) {
                nextClass = data
                break
            } else {
                nextClassPeriod++
            }
        }
        var title = "今日はもう授業はありません"
        var subTitle: String?
        if let nextClass = nextClass {
            title = "次は" + nextClass.name
            subTitle = nextClass.place
        }
        let shortcut3 = UIMutableApplicationShortcutItem(
            type: ShortcutType.Board.rawValue,
            localizedTitle: title,
            localizedSubtitle: subTitle,
            icon: UIApplicationShortcutIcon(templateImageName: "classIcon"),
            userInfo: ["shortcutKey": ShortcutType.NextClass.rawValue]
        )

        return [shortcut1, shortcut2, shortcut3]
    }
}

とりあえずテキトーに組んだので汚いのはごめんって感じ
とりあえずUIApplicationShortcutItemの配列をapplication.shortcutItemsに突っ込めばおkってこと、ちょー簡単!

こんな感じ〜
CQrWJ1rUcAA5RHG.jpg

起動時はfunc application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: Bool -> Void){}が呼ばれるっぽい(まだやってない)

 だがしかし

だがしかし!これには大きな問題があった…

Q. HomeDynamicShortcut.shortcuts()が呼ばれるのはいつ?
A. 起動時

そう、起動時にしかこの処理は呼ばれない
つまり、この「次は分子構造論2」のShortcutは、アプリを起動しないかぎり永遠に「次は分子構造論」というわけ

というわけで次の授業を表示するのはボツに
やるとしたら何ができるかなぁ…

感想

3D touchでなんかおもしろいことしたい