せっかく届いたTouch Barの使いみちが思い浮かばなかったのでPPAPでサンプルを作った

  • 32
    Like
  • 0
    Comment

つまりなにしたの

MacBook Proに搭載されたTouchBarをシンプルに使ったサンプルを作った。

概要

Cocoaのプロジェクトを新規作成
TouchBarを使うための設定をAppDeligate.Swiftに行う
StoryBoardにTouchBarを配置する
WindowControllerクラスを作成する
TouchBarのActionを拾えるようにする
音を鳴らす関数を用意する
PPAPを細切れにして格納
PPAPして楽しむ

環境

  • MacBook Pro (13-inch, Late 2016, Four Thunderbolt 3 Ports)
  • macOS Sierra 10.12.1(16B2657)←このバージョン大事(2016/11/21)
  • Xcode Version 8.1(8b62)

参考

https://developer.apple.com/reference/appkit/nstouchbar
https://developer.apple.com/reference/avfoundation/avaudioplayer
http://dev.classmethod.jp/smartphone/iphone/xcode-8-1-touch_bar-sample-code-part-1/
↑こちらはシリーズで参考にさせていただきました。

実装

github: https://github.com/EnsekiTT/PPAPBar
※ 音源は含まれていません

Cocoaのプロジェクトを新規作成

XCodeを立ち上げて 「Create a New Xcode Project」
macOSタブを選択して「Cocoa Application」
好きな名前をつける。仮に「PPAPBar」

PPAPBarプロジェクト
  PPAPBarディレクトリ
    AppDeligate.swift
    ViewController.swift
    Assets.xcassets
    Main.storyboard
    info.plist
Productsディレクトリ
みたいなプロジェクトが立ち上がるはず

TouchBarを使うための設定をAppDeligate.Swiftに行う

TouchBarが使える環境でのみ実行するためのコードを追加する
func applicationDidFinishLaunching(_ aNotification: Notification) {
の中に以下を入れる。

AppDeligate.swift

if NSClassFromString("NSTouchBar") != nil {
   NSApplication.shared().isAutomaticCustomizeTouchBarMenuItemEnabled = true
}

StoryBoardにTouchBarを配置する

Main.storyboardに移って
Object LibraryからTouchBarやそのButtonを選んでWindowControllerに配置した。
スクリーンショット 2016-11-21 1.54.09.png

WindowControllerクラスを作成する

無精してViewController.swiftの中にWindowControllerを用意しました。

ViewController.swift

class WindowController: NSWindowController, AVAudioPlayerDelegate {

}

これをWindowControllerSceneのWindowControllerのCustomClassに適用する。

TouchBarのActionを拾えるようにする

先程のWindowControllerの中に


    @IBAction func startAction(_ sender: NSButton){
        print("start")
        soundPlay(fileName: "start")
    }

を起こしたいActionの数だけ作る

WindowController.class

    @IBAction func startAction(_ sender: NSButton){
        print("start")
        soundPlay(fileName: "start")
    }

    @IBAction func pen1Action(_ sender: NSButton){
        print("Pen")
        soundPlay(fileName: "pen1")
    }


    @IBAction func pineAplleAction(_ sender: NSButton){
        print("pineapple")
        soundPlay(fileName: "pineapple")
    }

    @IBAction func appleAction(_ sender: NSButton){
        print("apple")
        soundPlay(fileName: "apple")
    }

    @IBAction func pen2Action(_ sender: NSButton){
        print("pen")
        soundPlay(fileName: "pen2")
    }

    @IBAction func endAction(_ sender: NSButton){
        print("end")
        soundPlay(fileName: "end")
    }

今回はPPAP用に6つ用意してみた。
StoryBoardのTouchBar各ボタンからCtrl+ドラッグで各アクションに接続する
ctrlpd.png

音を鳴らす関数を用意する

今のままだとsoundPlayが警告を発するはずなので音を鳴らす関数をWindowControllerに用意した

ViewController.swift
import AVFoundation

音を鳴らすためのAVFoundationをインポートして以下の関数と変数を追加する。

WindowController.Class
    var audioPlayer:AVAudioPlayer!

    func soundPlay(fileName: String) {
        // 再生する audio ファイルのパスを取得
        let audioPath = Bundle.main.path(forResource: fileName, ofType: "mp3")!
        let audioUrl = URL(fileURLWithPath: audioPath)
        print(audioUrl)


        // auido を再生するプレイヤーを作成する
        var audioError:NSError?
        do {
            audioPlayer = try AVAudioPlayer(contentsOf: audioUrl)
        } catch let error as NSError {
            audioError = error
            audioPlayer = nil
        }

        // エラーが起きたとき
        if let error = audioError {
            print("Error \(error.localizedDescription)")
        }

        audioPlayer.delegate = self
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    }

PPAPを細切れにして格納

Audacityとかを使ってPPAPの音源を細切れにして

start.mp3
pen1.mp3
pineapple.mp3
apple.mp3
pen2.mp3
end.mp3

の6音源を用意する。
(中身はなんでも良いので心の弱さから時事ネタに飛びついた)
これをPPAPディレクトリ直下のViewController.swiftと同レベルのところに全部放り込む。

PPAPして楽しむ

IMG_3268.JPG

TouchBarの感想

すごくさわり心地がいい
思いの外反応がいい
AppleのアプリだとTrackpadの利用頻度が結構下がるレベルに便利な機能がある
ターミナルのときだけFunctionキー設定などができるのがよかった
(買ってしまった以上褒めちぎるしかない)

これから

ネイティブアプリにも慣れていきたい。