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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
simon gladman
October 19, 2015
Programming
0
570
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
Tweet
Share
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
460
iOS GPU Programming with Swift & Metal
flexmonkey
4
36k
Other Decks in Programming
See All in Programming
Fragmented Architectures
denyspoltorak
0
160
humanlayerのブログから学ぶ、良いCLAUDE.mdの書き方
tsukamoto1783
0
200
CSC307 Lecture 02
javiergs
PRO
1
780
CSC307 Lecture 08
javiergs
PRO
0
670
インターン生でもAuth0で認証基盤刷新が出来るのか
taku271
0
190
CSC307 Lecture 09
javiergs
PRO
1
840
AIと一緒にレガシーに向き合ってみた
nyafunta9858
0
240
今から始めるClaude Code超入門
448jp
8
8.8k
AIエージェント、”どう作るか”で差は出るか? / AI Agents: Does the "How" Make a Difference?
rkaga
4
2k
MDN Web Docs に日本語翻訳でコントリビュート
ohmori_yusuke
0
650
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
450
Featured
See All Featured
What's in a price? How to price your products and services
michaelherold
247
13k
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
Side Projects
sachag
455
43k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
96
Information Architects: The Missing Link in Design Systems
soysaucechin
0
780
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
590
Statistics for Hackers
jakevdp
799
230k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
7.9k
AI: The stuff that nobody shows you
jnunemaker
PRO
2
260
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
730
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
1
53
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