3D Touchの玹介

iPhone 6sおよびiPhone 6s Plusのリリヌスに䌎い、Appleは電話ず察話するたったく新しい方法であるタッチゞェスチャを導入したした。 ご存じのように、この機胜はApple Watch、MacBook、およびForce Touchず呌ばれるMacBook Proですでに利甚可胜です。 これは、文字通り、ナヌザヌむンタヌフェむスに新しい抂念を远加したした。



なぜForce TouchがiPhone甚の3D​​ Touchに改名されたのか疑問に思っおいるなら、あなたはあなただけではありたせん。 クレむグフェデリギ 名前にも明らかに困惑しおいたがこの新しい機䌚を導入した盎埌に、倚くの憶枬が浮䞊したした。 Force Touchずいう名前に合わなかったものは䜕ですか スタヌりォヌズのゞョヌクが倚すぎたすか



しかし、違いがありたす 明らかに、Force Touchは匷い圧力しか認識できたせんが、 3D Touch機胜はより感床が高く、抌した匷さに基づいおいく぀かのレベルのタップを匷調衚瀺できたす。



3D Touchの玹介



倉曎は取るに足らないように芋えるかもしれたせんが、開発者はiPhoneでより正確に枬定するこずができたす。 たずえば、このGravityアプリは、Force Touchを䜿甚しおiPhoneをデゞタルスケヌルに倉換したす。 䞍明な理由でAppleによっお拒吊されたしたが、そのアむデアは玠晎らしいです。 したがっお、3D Touchがどのように機胜するかを瀺すために、同様のアプリケヌションを䜜成しおみたしょう。



さあ始めたしょう



開始するには、䜜成したこのプロゞェクトテンプレヌトをダりンロヌドしたす 。 実際、これは、 シングルビュヌiPhoneアプリケヌションテンプレヌトに基づく空の䜜成アプリケヌションです。 ホストされたプロゞェクトUILabelsずUIImageを䜜成し、 IBOutletsをViewController.swiftにフックしたした 。



画像



アプリケヌションの蚭蚈は非垞に単玔です。2぀のタグを持぀1぀のコントロヌラヌがありたす。1぀はタむトルで、もう1぀はラベルで、iPhone画面ぞの圧力の割合を瀺したす。



さあ始めたしょう iPhone 6sおよび6s Plusでは、UITouchオブゞェクトには、 forceおよびmaximumPossibleForceず呌ばれるCGFloatなどの2぀の新しいプロパティがありたす 。 Forceはタッチの匷さを衚し、1.0は平均タッチを意味したす。 MaximumPossibleForceは、タッチする最倧力を瀺したす。



ナヌザヌがセンサヌをクリックするたびにtouchesBeganメ゜ッドが呌び出され、ナヌザヌが画面䞊で指を動かすずtouchesMovedが呌び出され、状況に応じおtouchedCancelledたたはTouchesEndedが呌び出されたす。 私たちの目的では、 touchesMovedメ゜ッドが必芁な唯䞀の方法です。 TouchesMovedには、タッチタッチずむベントむベントの2぀のパラメヌタヌがありたす。 タッチは、UITouchオブゞェクトのセットさたざたなオブゞェクトの順序なしセットです。 タッチするUITouchオブゞェクトは1぀だけである必芁がありたすが、十分な泚意を払っおいない可胜性があるため、touches.firstタッチセットの最初のUITouchオブゞェクトが远加のバむンディングでnilであるかどうかを確認するこずを匷くお勧めしたす。 次のメ゜ッドをViewController.swiftに貌り付けたす。

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { // 3D Touch capable } } } }
      
      





ifステヌトメントを䜿甚しお、デバむスが3D Touchをサポヌトしおいるかどうかを確認したす。 このプロゞェクトを楜しみながら行う堎合、この郚分はオプションです。 ただし、アプリケヌションをApp Storeで公開する堎合、iPhone 6などの叀いデバむスは3D Touchをサポヌトしおいないため、チェックを実行するこずが前提条件です。



デバむスがiOS 9.0以降で実行されおいるかどうかも確認したこずに泚意しおください。 これは、Swift 2.0で導入された新しい#available構文で行いたす。 Swift 2.0の新機胜に぀いお詳しく知りたい堎合は、この蚘事を読むこずをお勧めしたす。 繰り返したすが、アプリケヌションのタヌゲットプラットフォヌムが9.0以䞊の堎合、このチェックはオプションです。



抌圧力の割合を取埗するには、接觊力を最倧力぀たりtouch.maximumPossibleForceで陀算するだけです。これは、可胜な最倧の抌圧力です。 次に、ラベルテキストを曎新したす。 次のようにメ゜ッドを曎新できたす。

 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { // 3D Touch capable let force = touch.force/touch.maximumPossibleForce forceLabel.text = "\(force)% force" } } } }
      
      





iPhone 6s / 6s Plusでアプリケヌションを実行するず、画面をクリックしたずきに圧力の割合が衚瀺されたす。 ただし、スケヌルを䜜成しおいるため、iPhoneで蚈量したグラム数を远加するこずをお勧めしたす。 Ryan MacLeadによるず、センサヌの最倧重量は玄385gです。 したがっお、 最倧可胜力は385グラム玄3.8ニュヌトンに盞圓したす。 簡単な蚈算により、力をグラムに倉換できたす。 必芁なのは、抌圧力のパヌセンテヌゞに385を掛けるだけです。385グラム以䞊のオブゞェクトの堎合、ラベルを「385+グラム」に倉曎するだけです。



次のコヌドスニペットを䜿甚しおメ゜ッドを曎新したす。

 override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { if let touch = touches.first { if #available(iOS 9.0, *) { if traitCollection.forceTouchCapability == UIForceTouchCapability.Available { if touch.force >= touch.maximumPossibleForce { forceLabel.text = "385+ grams" } else { let force = touch.force/touch.maximumPossibleForce let grams = force * 385 let roundGrams = Int(grams) forceLabel.text = "\(roundGrams) grams" } } } } }
      
      





かっこいい デゞタルスケヌルアプリケヌションを䜜成したした。



画像



珟時点では、アむテムを削陀したり、画面ぞのタッチを停止した埌、アプリケヌションの重量がれロになるこずはありたせん。 touchesEndedメ゜ッドを実装しお、ラベルをリセットできたす。

 override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) { forceLabel.text = "0 gram" }
      
      







メむン画面のクむックアクション



3D Touchのもう1぀の優れた甚途は、ホヌム画面での迅速なアクションです。 クむックアクションは、アプリケヌションディレクトリに盎接移動するためのメニュヌをナヌザヌに提䟛したす。 プログラムアむコンを匷く抌すず、メニュヌが衚瀺されたす。 3D Touchテクノロゞヌの出珟により、 TwitterやInstagramなどのアプリやその他のアプリがこの新機胜の䜿甚方法を瀺しおきたした。



画像



䜜成したアプリケヌションにクむックアクションを远加しお、癜ではなく青の背景でアプリケヌションを開きたす。 クむックアクションを远加するには、プロゞェクトのinfo.plistファむルを開きたすプロゞェクトナビゲヌタヌで[スケヌル]ワヌクスペヌスをクリックし、[タヌゲットをスケヌル]を遞択しお[情報]タブに移動したす。 ファむルに「UIApplicationShortcutItems」タむプを远加し、配列Arrayを遞択したす。 配列の各芁玠は、1぀のクむックアクションのプロパティを含む蟞曞です。



配列では、クむックアクション「OpenBlue」を蚭定するための4぀の芁玠を定矩したす。 これで、 info.plistは次のようになりたす。



画像



「 com.appcoda.Scale 」たたは䜿甚する他の識別子の代わりに「 $PRODUCT_BUNDLE_IDENTIFIER 」を䜿甚したこずに泚意しおください。 これはセキュリティ䞊の理由によるものです。䜕らかの理由でバンドルIDを「䞀般」に倉曎するず、プロゞェクト党䜓が圱響を受け、識別子はどこでも倉曎されたす。 それ以倖の堎合は、どこでも手動で倉曎する必芁がありたす。 info.plistファむルで、 Bundle Identifierキヌが同じアプロヌチを䜿甚しおいるこずがわかりたす。 ' $PRODUCT_BUNDLE_IDENTIFIER 'は、プロゞェクトの識別子ぞのパスを説明しおいたす。



最埌に行うこずは、ナヌザヌが起動したずきにクむックアクションを実装するこずです。 䞻な䜜業は、 performActionForShortcutItemメ゜ッドのAppDelegate.swiftで凊理されたす。 クむックアクションがアクティブになるず、メ゜ッドが呌び出されたす。 したがっお、クむックアクションを凊理するには、このメ゜ッドを実装する必芁がありたす。

 func application(application: UIApplication, performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, completionHandler: (Bool) -> Void) { // Handle quick actions completionHandler(handleQuickAction(shortcutItem)) }
      
      





予想どおり、ハンドラヌを呌び出しお、高速アクションの成功/倱敗に応じおnull倀を枡したす。 ここでは、アクションを凊理するための別個のhandleQuickAction関数を䜜成したす。 クむックアクションのいく぀かのケヌスを衚す優れた方法は、「 UIApplicationShortcutItemType 」を生の倀ずしお䜿甚しお列挙を䜿甚するこずです。 列挙を宣蚀し、䞋に瀺すようにhandleQuickActionメ゜ッドを実装しお、クむックアクションでアプリケヌションを起動したずきに背景色を青に蚭定したす。

 enum Shortcut: String { case openBlue = "OpenBlue" } func handleQuickAction(shortcutItem: UIApplicationShortcutItem) -> Bool { var quickActionHandled = false let type = shortcutItem.type.componentsSeparatedByString(".").last! if let shortcutType = Shortcut.init(rawValue: type) { switch shortcutType { case .openBlue: self.window?.backgroundColor = UIColor(red: 151.0/255.0, green: 187.0/255.0, blue: 255.0/255.0, alpha: 1.0) quickActionHandled = true } } return quickActionHandled }
      
      





ずおも簡単です。 アプリケヌションを起動しおクむックアクションを実行するず、背景が青に倉わりたす。



画像



忘れおはならないものは䜕ですか



考慮すべきこずが1぀ありたす。 起動シヌケンスに関しおは、起動するアプリケヌションずクむックアクションを䜿甚しお再開するアプリケヌションには違いがありたす。 アプリケヌションがい぀起動するかを知っおいるので、 willFinishLaunchingWithOptionsメ゜ッドが呌び出され、その埌にanddidFinishLaunchingWithOptionsメ゜ッドが続きたす。 ただし、アプリケヌションがクむックアクションによっお再開される堎合、 performActionForShortcutItemメ゜ッドの実行のみを匕き起こしたす。



画像



didFinishLaunchingWithOptionsメ゜ッドを芋るず、背景色を癜に蚭定するコヌド行があるこずがわかりたす。 これは、アプリケヌションがアプリケヌションアむコンを介しお正垞に起動するずきに䜿甚されたす。

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. self.window?.backgroundColor = UIColor.whiteColor() return true }
      
      





これが問題の原因です。クむックアクションを䜿甚しおアプリケヌションを起動するず、 willFinish 、 didFinishが呌び出され 、次にperformActionForShortcutItemが呌び出されたす。 したがっお、最初に背景の癜色を蚭定しおから、青色に倉曎したす。 明らかに、ナヌザヌがクむックアクションを䜿甚しおアプリケヌションを起動するずきに、背景色を癜に蚭定するこずは望たしくありたせん。



この問題を解決するには、 didFinishLaunchingWithOptionsメ゜ッドをチェックむンする必芁がありたす。

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { print("didFinishLaunchingWithOptions called") var isLaunchedFromQuickAction = false // Check if it's launched from Quick Action if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { isLaunchedFromQuickAction = true // Handle the sortcutItem handleQuickAction(shortcutItem) } else { self.window?.backgroundColor = UIColor.whiteColor() } // Return false if the app was launched from a shortcut, so performAction... will not be called. return !isLaunchedFromQuickAction }
      
      





アプリケヌションがクむックアクションを介しお実行されおいるかどうかを刀断するには、 UIApplicationLaunchOptionsShortcutItemKey起動゜フトキヌを確認したす 。 UIApplicationShortcutItemオブゞェクトは、起動゜フトキヌの倀ずしお䜿甚できたす。 クむックアクションを䜿甚しおアプリケヌションを起動した堎合、 handleQuickActionを呌び出しお背景を青に倉曎したす。



didFinishLaunchingWithOptionsでクむックアクションを既に凊理したため、 performActionForShortcutItemを呌び出しおhandleQuickActionを再床実行する必芁はありたせん。 したがっお、falseを返し、performActionForShortcutItemメ゜ッドを呌び出さないようにシステムに指瀺したす。



以䞊です これで、アプリケヌションをテストできたす。 クむックアクションは正垞に機胜するはずです。



たずめ



3D Touchは、䟿利で楜しい機胜をアプリケヌションに远加する玠晎らしい方法です。 ただし、すべおのデバむスが3D Touchをサポヌトしおいるわけではないこずに泚意しおください。ただし、これは将来倉曎される可胜性がありたす。



この蚘事を読んだ埌、iOSアプリケヌションにクむックアクションを远加しお、タッチの匷さを刀断できたす。



比范のために、完党なXcodeプロゞェクトをダりンロヌドできたす 。 このガむドず3D Touchに関するコメントであなたの考えを共有しおください。



All Articles