声に出して読みたいAppleのmacアプリサンプルコード集


# なにこれ
macアプリの開発ってiOSと同じノリでやろうとすると勝手が違うので結構つまづきます。
情報もなかなか落ちていないので、「**絶対**mac標準のUIなのにどうやって作ってんだこれ...」みたいなことになります。（僕は）

そんな時にApple公式のサンプルコードが役に立ちます。
以下に、役に立ちそうなものをいくつか挙げていきます。

なお、古いサンプルは当然のごとくObjective-Cだったりしますが、**情報があるだけありがたい**という安らかな気持ちです😌

# サンプルコード集
## どこにあんの
ここ → [Guides and Sample Code](https://developer.apple.com/library/content/navigation/#section=Resource%20Types&topic=Sample%20Code)

**AppKit** って書いてあるやつはmacアプリです。

## ベーシックなもの

### [Customizing NSSavePanel](https://developer.apple.com/library/content/samplecode/CustomSave/Introduction/Intro.html#//apple_ref/doc/uid/DTS10004201)

<img width="619" alt="スクリーンショット 2017-12-08 12.27.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/6e40a5cd-2186-8945-335b-9685f47f99ac.png">

こちらはSavePanelのサンプルです。
テキストエディタのアプリになっており、ファイル保存時の流れを確認することができます。

### [Packaged Document for OS X](https://developer.apple.com/library/content/samplecode/PackagedDocument/Introduction/Intro.html#//apple_ref/doc/uid/DTS40012955)

<img width="615" alt="スクリーンショット 2017-12-09 19.29.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/20dad0ba-ac8b-6783-85c6-7af57a05dd73.png">

`NSDocument`と`NSFileWrapper`を使用して、パッケージ化されたドキュメント（俗に言うファイル）を開いたり、編集したり、保存したりするためのテキストエディタアプリのサンプルです。
加えて、パッケージ化されたドキュメントをiCloudに保存する解説もあります。

このサンプルでは↑のような写真とテキストを入力して保存すると`.txpc`ファイルができます。

<img width="400" alt="スクリーンショット_2017-12-09_19_28_58.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/d780ff2c-1d02-f211-f044-98494983f78c.png">


### [OutlineView](https://developer.apple.com/library/content/samplecode/OutlineView/Introduction/Intro.html#//apple_ref/doc/uid/DTS40008836)

![スクリーンショット 2017-12-08 12.30.18.png](https://qiita-image-store.s3.amazonaws.com/0/61792/5c3432ad-f070-6557-0e6a-5bcc82216f8d.png)

シンプルなOutlineView（▼ボタンがついて階層化されたTableViewのイメージ）の実装サンプルです。
使用しているMacのフォルダ階層をOutlineViewで表しています。

### [NSPathControl Basics](https://developer.apple.com/library/content/samplecode/ObjectPath/Introduction/Intro.html#//apple_ref/doc/uid/DTS10004137)

![0b2b28af65fc83c83c3ee5bee551209a.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/5b5b53f5-c1a2-4875-bd29-b9fde1e36546.gif)

`NSPathControl`はFile Systemなどのパス情報を表示するControlです。
このサンプルでは`NSPathControlDelegate`を含む`NSPathControl`機能や使用方法が記載されています。

## 新しめなもの

### [NSTouchBar Catalog: Creating and Customizing NSTouchBar](https://developer.apple.com/library/content/samplecode/NSTouchBarCatalog/Introduction/Intro.html#//apple_ref/doc/uid/TP40017550)

TouchBarでできることがだいたいのってます。
以下は抜粋です。

#### Button
![3db6ce60580ab72067d39013a2d3f79c.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/85a6a23f-dc29-4899-e666-4cf215750299.gif)

#### Slider
![04d1eefad034ddeab8f0e8b84f2c5018.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/6929cb3c-4ea7-7cbb-1783-df76ccd18f43.gif)

#### Color Picker
![4e2faf1d52b544465ca93ece8a969d58.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/77e3657d-44f4-1c1c-1e32-b25fd747c4d2.gif)

#### Scroll View
![1641d74c0a95d9a72074a529e0c317ad.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/754f5897-e5e3-3a79-a618-19cbb0ad88ca.gif)


ちなみに
SimulatorでTouchBarの動きを見たい場合はメニューから以下を選択します。

```
Window → Show Touch Bar （Command + Shift + 5）
```


### [ForceTouchCatalog: Using the Force Touch Trackpad API](https://developer.apple.com/library/content/samplecode/ForceTouchCatalog/Introduction/Intro.html#//apple_ref/doc/uid/TP40016148)

![406c534ae2b11c098ae88a90981afeee.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/17c702d4-3845-0e36-2099-aab5b981ab58.gif)


Force Touch Trackpad APIのサンプルコードです。
3タブで構成されています。

* **Squire:** Force Touchを使ってボタン押下時の圧力レベルでインジケーターの表示を変える
* **Knight:** 圧力レベルで線の太さが変わるお絵かき
* **Master:** 触覚フィードバック

### [AlignmentGuides: AppKit Haptic Feedback Filtering using NSAlignmentFeedbackFilter](https://developer.apple.com/library/content/samplecode/AlignmentGuides/Introduction/Intro.html#//apple_ref/doc/uid/TP40016087)

![48c04a37fc04e52bfcbe5a188c8dbc6f.gif](https://qiita-image-store.s3.amazonaws.com/0/61792/ea4c0cb1-03b5-72d3-c28c-a9ee0d725500.gif)

`NSAlignmentFeedbackFilter`を使った触覚フィードバック(Haptic Feedback)のサンプルです。
上記の画像だけではわかりにくいのですが、矩形をforce clickしながらdragして矩形の線と背景の線が重なる時にTrackPadが振動します。

描画系のアプリなど正しい位置に整列する時にスナップに加えて、こういった触覚フィードバックを返すとより直感的なるかと思います。

触覚フィードバックについて詳しくは[Human interface guidelines](https://developer.apple.com/macos/human-interface-guidelines/user-interaction/mouse-and-trackpad/#haptic-feedback)等にも記載されていますので興味がありましたらご覧ください。

## おまけ
### [TextEdit](https://developer.apple.com/library/content/samplecode/TextEdit/Introduction/Intro.html#//apple_ref/doc/uid/DTS40011741)

みんな大好き（要出典）TextEditのソース

<img width="185" alt="スクリーンショット 2017-12-09 21.01.11.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/a37e93e1-f1eb-fcea-e507-3f7bb910dfb0.png">


## まとめ
いかがでしたでしょうか。
ググっても情報が出てこなかったらとりあえずAppleのサンプルコードにすがってみるのがいいと思います。
（僕はなんて検索すればいいかわからなくて結局困ったりします😞）

なお、上記ではアプリに絞って挙げましたが、Mac向けドライバのサンプルなども豊富にありますので興味がありましたらぜひ漁ってみてください。