Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
An introduction to 3D Touch for Swift developers
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
simon gladman
October 19, 2015
Programming
570
0
Share
An introduction to 3D Touch for Swift developers
My Swift London talk of October 19, 2015 discussing 3D Touch for Swift
simon gladman
October 19, 2015
More Decks by simon gladman
See All by simon gladman
Image Processing for iOS
flexmonkey
0
1.4k
Introducing Image Processing in Metal
flexmonkey
0
490
iOS GPU Programming with Swift & Metal
flexmonkey
2
510
Creating Apps Without Interface Builder
flexmonkey
0
470
iOS GPU Programming with Swift & Metal
flexmonkey
4
36k
Other Decks in Programming
See All in Programming
Feature Toggle は捨てやすく使おう
gennei
0
590
2026-03-27 #terminalnight 変数展開とコマンド展開でターミナル作業をスマートにする方法
masasuzu
0
330
CDK Deployのための ”反響定位”
watany
4
740
Reactive ❤️ Loom: A Forbidden Love Story
franz1981
2
230
存在論的プログラミング: 時間と存在を記述する
koriym
5
880
一度始めたらやめられない開発効率向上術 / Findy あなたのdotfilesを教えて!
k0kubun
4
2.9k
今こそ押さえておきたい アマゾンウェブサービス(AWS)の データベースの基礎 おもクラ #6版
satoshi256kbyte
1
240
「話せることがない」を乗り越える 〜日常業務から登壇テーマをつくる思考法〜
shoheimitani
4
780
PHP でエミュレータを自作して Ubuntu を動かそう
m3m0r7
PRO
2
180
クラウドネイティブなエンジニアに向ける Raycastの魅力と実際の活用事例
nealle
1
160
AI時代のPhpStorm最新事情 #phpcon_odawara
yusuke
0
170
GNU Makeの使い方 / How to use GNU Make
kaityo256
PRO
16
5.6k
Featured
See All Featured
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
770
Chasing Engaging Ingredients in Design
codingconduct
0
170
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
180
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
23k
Building the Perfect Custom Keyboard
takai
2
730
The Curious Case for Waylosing
cassininazir
0
300
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
2.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
180
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
260
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.8k
Scaling GitHub
holman
464
140k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
450
Transcript
3D TOUCH An introduction to 3D Touch for Swift developers
Simon Gladman for Swift London / October 2015
HELLO FLEX MONKEY • Blog: flexmonkey.blogspot.co.uk • GitHub: github.com/FlexMonkey •
Twitter: @FlexMonkey
3D TOUCH FOR USERS
3D TOUCH FOR USERS • Peek
3D TOUCH FOR USERS • Peek • Preview Actions
3D TOUCH FOR USERS • Peek • Preview Actions •
Pop
3D TOUCH FOR USERS • Peek • Preview Actions •
Pop • Quick Actions
3D TOUCH FOR USERS • Peek • Preview Actions •
Pop • Quick Actions • Pressure Sensitivity
3D TOUCH FOR DEVS • Simple API • Check device
supports 3D Touch traitCollection.forceTouchCapability == UIForceTouchCapability.Available
• Simple API • Getting force value override func touchesBegan(touches:
Set<UITouch>, withEvent event: UIEvent?) { guard let touch = touches.first else { return } let normalisedForce = touch.force / touch.maximumPossibleForce print(normalisedForce) }
• Simple API • Implementing peek and pop registerForPreviewingWithDelegate(delegate, sourceView:
sourceView) • sourceView reacts to deep press • delegate must implement UIViewControllerPreviewingDelegate
• Peeking & Popping with Previewing Delegate • Protocol contains
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
• Peeking & Popping with Previewing Delegate • Protocol contains
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController)
3D TOUCH: PEEKING • Peeking - a deep press func
previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
• Peeking func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController?
{ let peek = PeekViewController(hsl: hsl, delegate: previewingContext.delegate) return peek }
• Peeking let hsl: HSL unowned let delegate: UIViewControllerPreviewingDelegate required
init(hsl: HSL, delegate: UIViewControllerPreviewingDelegate) { self.hsl = hsl self.delegate = delegate super.init(nibName: nil, bundle: nil) let color = UIColor(hue: hsl.hue, saturation: hsl.saturation, brightness: hsl.lightness, alpha: 1) label.text = "Your color: \(color.getHex())" label.textAlignment = NSTextAlignment.Center smallSwatch.backgroundColor = color }
None
3D TOUCH: PREVIEW ACTIONS • Preview Actions • The previewing
delegate simply needs to implement previewActions()
• Preview Actions enum ColorPresets: String { case Red, Green,
Blue } var previewActions: [UIPreviewActionItem] { return [ColorPresets.Red, ColorPresets.Green, ColorPresets.Blue].map { UIPreviewAction(title: $0.rawValue, style: UIPreviewActionStyle.Default, handler: { (previewAction, viewController) in (viewController as? PeekViewController)?.updateColor(previewAction) }) } }
• Preview Actions func updateColor(previewAction: UIPreviewActionItem) { guard let delegate
= delegate as? ChromaTouchViewController, preset = ColorPresets(rawValue: previewAction.title) else { return } let hue: CGFloat switch preset { case .Blue: hue = 0.667 case .Green: hue = 0.333 case .Red: hue = 0 } delegate.hsl = HSL(hue: hue, saturation: 1, lightness: 1) }
None
3D TOUCH: POPPING • Popping - a deeper press func
previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController)
• Popping func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) { swatch.userInteractionEnabled
= false hslSlidersStackView.hidden = true }
None
3D TOUCH: PRESSURE SENSITIVITY • Touch gestures have ‘x’ and
‘y’ coordinates • Now have a ‘z’ coordinate corresponding to the pressure of the touch
• Override touchesMoved(): override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?)
{ guard let touch = touches.first else { return } let touchLocation = touch.locationInView(self) let force = touch.force let maximumPossibleForce = touch.maximumPossibleForce let normalisedXPosition = touchLocation.x / frame.width let normalisedYPosition = touchLocation.y / frame.height let normalisedZPosition = force / maximumPossibleForce hsl = HSL(hue: normalisedXPosition, saturation: normalisedYPosition, lightness: normalisedZPosition) sendActionsForControlEvents(.ValueChanged) }
None
GESTURE RECOGNISERS • As an alternative to overriding a control’s
touch handling methods • By extending UIGestureRecognizer let deepPressGestureRecognizer = DeepPressGestureRecognizer(target: self, action: "deepPressHandler:", threshold: 0.75) button.addGestureRecognizer(deepPressGestureRecognizer)
• Handle user’s actions in gesture recogniser’s touch handlers override
func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent) { guard let view = view, touch = touches.first where touch.force != 0 && touch.maximumPossibleForce != 0 else { return } if !deepPressed && (touch.force / touch.maximumPossibleForce) >= threshold { state = UIGestureRecognizerState.Began deepPressed = true } else if deepPressed && (touch.force / touch.maximumPossibleForce) < threshold { state = UIGestureRecognizerState.Ended deepPressed = false } }
TOUCH COALESCING • touchesMoved() samples at up to 60 hertz
TOUCH COALESCING • touchesMoved() samples at up to 60 hertz
• iPhone 6s has a touch sample rate of 120 hertz
TOUCH COALESCING • touchesMoved() samples at up to 60 hertz
• iPhone 6s has a touch sample rate of 120 hertz • iPad Pro will sample touches at 240 hertz
• The missing touches can be accessed through the event’s
coalescedTouches override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) { super.touchesMoved(touches, withEvent: event) guard let touch = touches.first, coalescedTouches = event?.coalescedTouchesForTouch(touch) else { return } for coalescedTouch in coalescedTouches { let locationInView = coalescedTouch.locationInView(view) print(locationInView) } }
None
SOME DEMO APPS
None
None
None
None
None
http://goo.gl/rzPExI flexmonkey.blogspot.co.uk github.com/FlexMonkey