iPhone 6sããã³iPhone 6s Plusã®ãªãªãŒã¹ã«äŒŽããAppleã¯é»è©±ãšå¯Ÿè©±ãããŸã£ããæ°ããæ¹æ³ã§ããã¿ãããžã§ã¹ãã£ãå°å
¥ããŸããã ãåãã®ããã«ããã®æ©èœã¯Apple WatchãMacBookãããã³Force TouchãšåŒã°ããMacBook Proã§ãã§ã«å©çšå¯èœã§ãã ããã¯ãæåéãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã«æ°ããæŠå¿µãè¿œå ããŸããã
ãªãForce TouchãiPhoneçšã®3Dââ Touchã«æ¹åãããã®ãçåã«æã£ãŠãããªããããªãã¯ããªãã ãã§ã¯ãããŸããã
ã¯ã¬ã€ã°ãã§ããªã® ïŒååã«ãæããã«å°æããŠããïŒããã®æ°ããæ©äŒãå°å
¥ããçŽåŸã«ãå€ãã®æ¶æž¬ãæµ®äžããŸããã Force Touchãšããååã«åããªãã£ããã®ã¯äœã§ããïŒ ã¹ã¿ãŒãŠã©ãŒãºã®ãžã§ãŒã¯ãå€ãããŸããïŒ
ããããéãããããŸãïŒ æããã«ãForce 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ã€ã®ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®ããããã£ãå«ãèŸæžã§ãã
- UIApplicationShortcutItemType ïŒ å¿
é ïŒïŒã¯ã€ãã¯ã¢ã¯ã·ã§ã³ãèå¥ããæååã ãã®æååã¯ãã¢ããªã±ãŒã·ã§ã³åºæã®äžæã§ããå¿
èŠãããããšã«æ³šæããŠãã ããã äžæã®æååãäœæããã«ã¯ãèå¥åãŸãã¯ãã®ä»ã®ããªãã¯ã䜿çšããŠãã¬ãã£ãã¯ã¹ãè¿œå ããããšããå§ãããŸãã
- UIApplicationShortcutItemTitle ïŒ å¿
é ïŒïŒæååããŠãŒã¶ãŒã«è¡šç€ºãããã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®ã¿ã€ãã«ãè¡šããŸãã äŸã¯ããæåŸã«æ®åœ±ããåçã衚瀺ãããã§ãã
- UIApplicationShortcutItemSubtitle ïŒ ãªãã·ã§ã³ ïŒïŒã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®ååã®æååã äŸã¯ãæšæ¥æ®åœ±ããæåŸã®åçãã§ãã ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®ã¢ã€ã³ã³ãè¿œå ããå ŽåãAppleã®ã·ã¹ãã ã¢ã€ã³ã³ãŸãã¯ã«ã¹ã¿ã ã¢ã€ã³ã³ã®2ã€ã®ãªãã·ã§ã³ããããŸãã
- UIApplicationShortcutItemIconType ïŒ ãªãã·ã§ã³ ïŒïŒã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®æšªã«è¡šç€ºãããã·ã¹ãã ã¢ã€ã³ã³ã瀺ãæååã
- UIApplicationShortcutItemIconFile ïŒ ãªãã·ã§ã³ ïŒïŒã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã®æšªã«è¡šç€ºãããã«ã¹ã¿ã ã¢ã€ã³ã³ã瀺ãæååã
- UIApplicationShortcutItemUserInfo ïŒ ãªãã·ã§ã³ ïŒïŒã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã§å®è¡ãããè¿œå æ
å ±ãå«ãèŸæžã
é
åã§ã¯ãã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã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) {
äºæ³ã©ããããã³ãã©ãŒãåŒã³åºããŠãé«éã¢ã¯ã·ã§ã³ã®æå/倱æã«å¿ããŠ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 {
ãããåé¡ã®åå ã§ããã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšã
willFinish ã
didFinishãåŒã³åºãã ã次ã«
performActionForShortcutItemãåŒã³åºãããŸãã ãããã£ãŠãæåã«èæ¯ã®çœè²ãèšå®ããŠãããéè²ã«å€æŽããŸãã æããã«ããŠãŒã¶ãŒãã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã«ãèæ¯è²ãçœã«èšå®ããããšã¯æãŸãããããŸããã
ãã®åé¡ã解決ããã«ã¯ã
didFinishLaunchingWithOptionsã¡ãœããããã§ãã¯ã€ã³ããå¿
èŠããããŸãã
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { print("didFinishLaunchingWithOptions called") var isLaunchedFromQuickAction = false
ã¢ããªã±ãŒã·ã§ã³ãã¯ã€ãã¯ã¢ã¯ã·ã§ã³ãä»ããŠå®è¡ãããŠãããã©ãããå€æããã«ã¯ã
UIApplicationLaunchOptionsShortcutItemKeyèµ·å
ãœããããŒã確èªã
ãŸã ã
UIApplicationShortcutItemãªããžã§ã¯ãã¯ãèµ·åãœããããŒã®å€ãšããŠäœ¿çšã§ããŸãã ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ãèµ·åããå Žåã
handleQuickActionãåŒã³åºããŠèæ¯ãéã«å€æŽããŸãã
didFinishLaunchingWithOptionsã§ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ãæ¢ã«åŠçããããã
performActionForShortcutItemãåŒã³åºããŠ
handleQuickActionãå床å®è¡ããå¿
èŠã¯ãããŸããã ãããã£ãŠãfalseãè¿ããperformActionForShortcutItemã¡ãœãããåŒã³åºããªãããã«ã·ã¹ãã ã«æ瀺ããŸãã
以äžã§ãïŒ ããã§ãã¢ããªã±ãŒã·ã§ã³ããã¹ãã§ããŸãã ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ã¯æ£åžžã«æ©èœããã¯ãã§ãã
ãŸãšã
3D Touchã¯ã䟿å©ã§æ¥œããæ©èœãã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããçŽ æŽãããæ¹æ³ã§ãã ãã ãããã¹ãŠã®ããã€ã¹ã3D TouchããµããŒãããŠããããã§ã¯ãªãããšã«æ³šæããŠãã ããããã ããããã¯å°æ¥å€æŽãããå¯èœæ§ããããŸãã
ãã®èšäºãèªãã åŸãiOSã¢ããªã±ãŒã·ã§ã³ã«ã¯ã€ãã¯ã¢ã¯ã·ã§ã³ãè¿œå ããŠãã¿ããã®åŒ·ããå€æã§ããŸãã
æ¯èŒã®ããã«
ãå®å
šãªXcodeãããžã§ã¯ããããŠã³ããŒãã§ã
ãŸã ã ãã®ã¬ã€ããš3D Touchã«é¢ããã³ã¡ã³ãã§ããªãã®èããå
±æããŠãã ããã