狠狠撸

狠狠撸Share a Scribd company logo
3D#touch#for#iOS
2015/09/16
@TachibanaKaoru
自己紹介
渋谷のVOYAGE'GROUPでiOSエンジニア
をしています。
Twi$er/Vainglory/:/@TachibanaKaoru
Blog/:/h$p://www.toyship.org/
注意
今日の資料はAppleが一般に公開した資料をもとにしています。
なお、この資料の内容サンプルコードや発表資料から類推したも
のであり、シミュレーターや実機での動作確認を行っていませ
ん。
間違いを含む可能性があります。(実機入手後確認予定。)
What%is%3D%touch?
Speci?ca(on
iOS9で導入された感圧機能を使った新しい機能
対応端末はiPhone6S/iPhone6S,plus
一部の機能は9.1からとなりますが、9.0からすでに実装できる機
能がほとんどです。
Pressure&Sensi*vity
タッチの圧力を判定してアプリの機能を
拡張できます。
例えばスケッチアプリであれば、圧力に
応じて線を太くしたり、色を濃くしたり
する実装をすることもできます。
圧力の感知だけでなく、今タッチしてい
るものがスタイラスか指かの判定も可能
です。
Quick&Ac(ons
ホーム画面のアプリアイコンを押すこと
で、メニューを表示することができるよ
うになりました。
Peek$and$Pop
次の画面を出すような画面で、画面遷移
をする前に、次の画面をちらっと見るこ
とができる機能。
表示されたチラ見画面にメニューをつけ
たりすることもできます。
3D#Touch#の動作確認
なお、現時点では3D#touch関連の機能の動作確認はシミュレー
ターではできません。
実際の動作は、対応端末が発売されるまで待ちましょう。
Pressure&Sensi*vity
Implementa)on
Pressure&Sensi*vity
基本的には、UITouchクラスに追加されているforce(CGFLoat)
値を使ってアプリの機能に応じて実装します。
また、UITouchのtype(UITouchType)から、touch処理がどこか
ら行われているかの情報が取得できます。
enum UITouchType : Int {
case Direct
case Indirect
case Stylus
}
Pressure&Sensi*vity
9.1ではさらにUITouchクラスに下記の要
素などが追加される予定。
+,al/tudeAngle:,CGFloat,{,get,}
+,azimuthAngleInView(_,view:,UIView?),+>,
CGFloat
スタイラスの圧力だけではなく、入力角
度なども取得できるようになりそうで
す。
Quick&Ac(ons
Implementa)on
Quick&Ac(ons
設定方法は下記の2種類あります。
!"sta&c"quick"ac&ons
"!"必ず表示される固定メニュー。
"!"アプリのino.plistで定義
!"dynamic"quick"ac&ons
"!"ユーザーの状況などによって内容が変更できるメニュー。
"!"コードで設定
Quick&Ac(ons
メニューの表示順
表示数には上限数があり、info.plistに設定された*sta,c*ac,onsが
まず表示されます。
(上限数は現時点では明記されていない)
sta,c*ac,onsを表示した後に表示数に余裕がある場合には、
dynamic*ac,onsも表示されます。
アプリの初回起動時前には、sta,c*ac,onsしか表示されません。
Quick&Ac(ons
Implementa)on
dynamic(ac)onsの場合には、
UIApplica)onShortcutItemオブジェクト
を作成して、UIApplica)onに登録します
7(localizedTitle
7(localizedSub)tle
7(type
7(icon
7(userInfo
Quick&Ac(ons
アイコンについて
UIApplica)onShortcutItem3に設定できる
アイコンはUIApplica)onShortcutIconと
なっており、システムで用意されたアイ
コン、自分で用意するアイコン、連絡先
アイコンのうちから選択可能です。
(自分で用意する場合は35x35pointで、
単色のみ使用可能)
Quick&Ac(ons
実装例!(add!dynamic!ac*ons)
func application(application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [NSObject: AnyObject]?) -> Bool {
if let shortcutItems = application.shortcutItems where shortcutItems.isEmpty {
let shortcutPlay = UIMutableApplicationShortcutItem(
type: "MyApp.MenuType001",
localizedTitle: "Play",
localizedSubtitle: "with this title",
icon: UIApplicationShortcutIcon(type: .Play),
userInfo: nil
)
application.shortcutItems = [shortcutPlay]
}
...
}
Quick&Ac(ons
実装例!(add!sta'c!ac'ons)
// info.plist
<key>UIApplicationShortcutItems</key>
<array>
<dict>
<key>UIApplicationShortcutItemIconType</key>
<string>UIApplicationShortcutIconTypeSearch</string>
<key>UIApplicationShortcutItemSubtitle</key>
<string>shortcutSubtitle1</string>
<key>UIApplicationShortcutItemTitle</key>
<string>shortcutTitle1</string>
<key>UIApplicationShortcutItemType</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER).First</string>
<key>UIApplicationShortcutItemUserInfo</key>
<dict>
<key>firstShorcutKey1</key>
<string>firstShortcutKeyValue1</string>
</dict>
</dict>
</array>
Quick&Ac(ons
実装例!(ac%onsがよばれた時)
// in AppDelegate
func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: Bool -> Void) {
guard ShortcutIdentifier(fullType: shortcutItem.type) != nil else { return false }
guard let shortCutType = shortcutItem.type as String? else { return false }
switch (shortCutType) {
case "Menu1":
// Menu1の処理
case "Menu2":
// Menu2の処理
default:
}
}
Peek$and$Pop
Implementa)on
Peek$and$Pop
Peek$and$Popの流れ
(1)特定のエリアを軽く押す(Peek)
(2)Peek画面が表示される(押すのをやめると元の画面に戻る)
(3)さらに強く押す(Pop)とPeek画面が大きくなり、目的のview画面
となる
3D touch for iOS
Peek$and$Pop
Master'Detail形式のプロジェクトで実装する場合の標準的な流れ
(1)$3Dtouchが使えるか確認し、どのviewがpeekの対象になるかを
設定。同時にpeek処理のdelegateを設定。
(2)$ユーザーがPeekジェスチャーに対して、peekの表示対象となる
viewControllerの作成と、表示されるサイズ(高さのみ)を指定。
(3)$ユーザーがPopジェスチャーに対して、peekで作成された
viewControllerの通常表示処理を行う。
Peek$and$Pop
実装例!(1)!peekのviewを指定して、delegateを設定。
// MasterViewController
override func viewDidLoad() {
super.viewDidLoad()
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: myview)
}
}
Peek$and$Pop
実装例!(2)!Peekジェスチャーの実装
// MasterViewController
func previewingContext(previewingContext: UIViewControllerPreviewing,
viewControllerForLocation location: CGPoint) -> UIViewController? {
let detailViewController = ...//表示したいviewControllerを生成する
//表示するPeek画面の高さを設定する
detailViewController.preferredContentSize = CGSize(width: 0.0, height: 50.0)
//Peek画面が出る前にBlurしない領域を設定する
previewingContext.sourceRect = myview.frame
return detailViewController
}
Peek$and$Pop
実装例!(3)!Popジェスチャーの実装
// MasterViewController
func previewingContext(previewingContext: UIViewControllerPreviewing,
commitViewController viewControllerToCommit: UIViewController) {
//表示用のviewControllerはpeekの時に生成されているので、それを再利用する
showViewController(viewControllerToCommit, sender: self)
}
Peek$and$Pop
Peek時にAc&onMenuを追加することもで
きます。
Peek$and$Pop
実装例!Ac$onMenuの追加
// DetailViewController
override func previewActionItems() -> [UIPreviewActionItem] {
let actionMail = UIPreviewAction(title: "Send mail",
style: .Default,
handler:{item,viewcon in
// send mail
})
let actionDelete = UIPreviewAction(title: "Delete mail",
style: .Destructive,
handler:{item,viewcon in
// delete mail
})
return [actionMail,actionDelete]
}
Peek$and$Pop
Implementa)on
UIWebViewやMKWebViewでは、リンク
先をPeekする機能がすでに実装されてい
ますが、デフォルトではo?になっていま
す。
allowsLinkPreviewをtrueにすると使
えるようになります。
まとめ
? 3D$touch機能は、まだ実機やシミュレーターでの動作確認はで
きませんが、実装は可能です。
? 実装自体はそれほど難しくはないので、是非試してみることを
お勧めします。

More Related Content

3D touch for iOS