leveraging touch input on ios - apple inc.3d touch a peek at 3d touch presidio thursday 4:00pm. ipad...

121
© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. …And getting the most out of Apple Pencil App Frameworks #WWDC16 Session 220 Leveraging Touch Input on iOS Dominik Wagner UIKit Engineer

Upload: others

Post on 08-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

© 2016 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

…And getting the most out of Apple Pencil

App Frameworks #WWDC16

Session 220

Leveraging Touch Input on iOS

Dominik Wagner UIKit Engineer

Page 2: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

New and Recent Hardware

Page 3: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

iPhone 6s and iPhone 6s Plus3D Touch

A Peek at 3D Touch Presidio Thursday 4:00PM

Page 4: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

iPad Air 2 and iPad ProFaster Touch Scanning

Page 5: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

iPad ProApple Pencil

Precise location240 Hz scan rateTilt, orientation, and forcePalm rejection

Page 6: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Apple TVSiri Remote

UIFocusEngineGame ControllerIndirect touches

Page 7: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Apple TVSiri Remote

UIFocusEngineGame ControllerIndirect touches

Apple TV Tech Talks

Controlling Game Input for Apple TV Mission Wednesday 5:00PM

Page 8: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Building a Drawing App

Page 9: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

AgendaBuilding a Drawing App

New APIStep-by-stepSample code available

Page 10: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Say Hello to SpeedSketch

One sheet of paper you can draw onFull support for Apple Pencil and 3D Touch

Page 11: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Model and captureBuilding a Drawing App

Page 12: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Model and captureBuilding a Drawing App

Series of strokesUITouch in event callbacksCopy the relevant data

Page 13: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Model and captureBuilding a Drawing App

struct StrokeSample {

let location: CGPoint

}StrokeSample

Page 14: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class Stroke {

var samples: [StrokeSample] = []

func add(sample: StrokeSample)

}

Model and captureBuilding a Drawing App

Stroke

StrokeSample

StrokeSample

StrokeSample

Page 15: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class Stroke {

var samples: [StrokeSample] = []

func add(sample: StrokeSample)

}

var state: StrokeState = .active

enum StrokeState {

case active

case done

case cancelled

}

Model and captureBuilding a Drawing App

Stroke

StrokeSample

StrokeSample

StrokeSample

Page 16: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class StrokeCollection {

var strokes: [Stroke] = []

func add(doneStroke: stroke)

}

Model and captureBuilding a Drawing App

StrokeCollection

Stroke

StrokeSample

StrokeSample

StrokeSample

Stroke

Stroke

Page 17: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class StrokeCollection {

var strokes: [Stroke] = []

func add(doneStroke: stroke)

}

var activeStroke: Stroke?

Model and captureBuilding a Drawing App

StrokeCollection

Stroke

StrokeSample

StrokeSample

StrokeSample

Stroke

Stroke

Page 18: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Model and captureBuilding a Drawing App

Where to capture?• UIGestureRecognizer• UIView• Up the responder chain

Page 19: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Custom UIGestureRecognizerTargeting the main view controllerView controller facilitates update

CaptureBuilding a Drawing App

Stroke View

Canvas View Controller

Stroke Gesture Recognizer

Page 20: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

}

Page 21: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

}

Page 22: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

}

Page 23: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

}

Page 24: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {

}

}

if appendTouches(touches, event:event) { state = .began }

Page 25: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .began } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .changed } }

}

Page 26: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .began } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .changed } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) … override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) …

}

Page 27: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .began } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .changed } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) … override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) …

override func reset() { stroke = Stroke() super.reset() } }

Page 28: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

import UIKit.UIGestureRecognizerSubclass

class StrokeGestureRecognizer: UIGestureRecognizer {

var stroke = Stroke()

func appendTouches(_ touches: Set<UITouch>, event: UIEvent?) -> Bool …

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .began } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if appendTouches(touches, event:event) { state = .changed } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) … override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) …

override func reset() { stroke = Stroke() super.reset() } }

Page 29: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class CanvasViewController: UIViewController {

override func viewDidLoad() { super.viewDidLoad()

}

}

Page 30: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class CanvasViewController: UIViewController {

override func viewDidLoad() { super.viewDidLoad() let strokeRecognizer = StrokeGestureRecognizer( target: self,

action: #selector(strokeUpdated(_:)) )

view.addGestureRecognizer(strokeRecognizer) }

}

Page 31: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class CanvasViewController: UIViewController {

override func viewDidLoad() { super.viewDidLoad() let strokeRecognizer = StrokeGestureRecognizer( target: self,

action: #selector(strokeUpdated(_:)) )

view.addGestureRecognizer(strokeRecognizer) }

func strokeUpdated(_ strokeGesture: StrokeGestureRecognizer) { view.strokeToDraw = strokeGesture.stroke }

}

Page 32: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class CanvasViewController: UIViewController {

override func viewDidLoad() { super.viewDidLoad() let strokeRecognizer = StrokeGestureRecognizer( target: self,

action: #selector(strokeUpdated(_:)) )

view.addGestureRecognizer(strokeRecognizer) }

func strokeUpdated(_ strokeGesture: StrokeGestureRecognizer) { view.strokeToDraw = strokeGesture.stroke }

}

Page 33: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Let’s have a look

Page 34: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Pencil tip

Page 35: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 36: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Long, choppy lines

Excessive gap

Pencil

Page 37: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Analysis of First Attempt

Missed events• Drawing engine• Did not use the new iOS 9.0 API

Page 38: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Anatomy of a Stroke

Page 39: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Anatomy of a Stroke

Page 40: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Anatomy of a Stroke

Began

Ended

Page 41: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Anatomy of a Stroke

Began

Ended

Page 42: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Anatomy of a Stroke

Began

Ended

Moved

Moved

MovedMoved

Moved

Page 43: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Began

Ended

Moved

Moved

MovedMoved

Moved

Anatomy of a Stroke

Page 44: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Began

Ended

Moved

Moved

MovedMoved

Moved

Anatomy of a Stroke

Coalesced

Page 45: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Began

Ended

Moved

Moved

MovedMoved

Moved

Anatomy of a Stroke

Coalesced

Page 46: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Began

Ended

Moved

Moved

MovedMoved

Moved

Anatomy of a Stroke

Coalesced

Page 47: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Coalesced Touches

class UIEvent {

public func coalescedTouches(for touch: UITouch) -> [UITouch]?

}

Page 48: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Coalesced Touches

class StrokeGestureRecognizer: UIGestureRecognizer {

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {

appendTouch(touch)

}

}

}

Page 49: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Coalesced Touches

class StrokeGestureRecognizer: UIGestureRecognizer {

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {

for coalescedTouch in event.coalescedTouches(for: touch) {

appendTouch(touch)

}

}

}

}

Page 50: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 51: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 52: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

PencilCoalesced touches (gray)

Live touch (black)Excessive gap

Too many coalesced touches

Page 53: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Analysis of Second Attempt

Speed is still lackingUIKit helped us by coalescing

Page 54: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Do Not Draw on Every Touch Event

Display refresh rate is 60 HzIncoming event frequency can reach 240 Hz and moreDo not try to draw faster than screen can refresh

Page 55: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

UIView

• Use setNeedsDisplay()

• Implement draw(_ rect: CGRect)

GLKView, MTLView

• Set the enableSetNeedsDisplay property to true

• If required, draw at a steady rate using a CADisplayLink object

When to Render?

Page 56: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class StrokeCGView: UIView {

var strokeToDraw: Stroke? {

didSet {

drawImageAndUpdate()

}

}

}

Page 57: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

class StrokeCGView: UIView {

var strokeToDraw: Stroke? {

didSet {

setNeedsDisplay()

}

}

}

Page 58: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Activate drawsAsynchronously on the layer

Mark only the changed areas• setNeedsDisplayIn(rect: changedRect)

Even Better

class StrokeCGView: UIView {

override init(frame: CGRect) {

super.init(frame: frame)

layer.drawsAsynchronously = true

}

}

Page 59: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 60: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Steady amount of coalesced touches

Still some lag

Page 61: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Improve Perceived Latency

Use predicted touches

class UIEvent {

public func predictedTouches(for touch: UITouch) -> [UITouch]?

}

Page 62: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Predicted Touches

Add predicted touches to your data structure temporarilyChoose their appearance, depending on your app• To appear like actual touches• To appear as tentative

Page 63: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Predicted Touches

class StrokeGestureRecognizer: UIGestureRecognizer {

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {

for coalescedTouch in event.coalescedTouches(for:touch) {

appendTouch(touch)

}

}

}

}

Page 64: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Predicted Touches

class StrokeGestureRecognizer: UIGestureRecognizer {

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {

for coalescedTouch in event.coalescedTouches(for:touch) {

appendTouch(touch)

}

for predictedTouch in event.predictedTouches(for:touch) {

appendTouchTemporarily(touch)

}

}

}

}

Page 65: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Predicted Touches

class StrokeGestureRecognizer: UIGestureRecognizer {

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {

if let touch = touches.first {

clearTemporaryTouches()

for coalescedTouch in event.coalescedTouches(for:touch) {

appendTouch(touch)

}

for predictedTouch in event.predictedTouches(for:touch) {

appendTouchTemporarily(touch)

}

}

}

}

Page 66: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 67: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Predicted touches

Page 68: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

What Have We Seen so Far

Collect input data using a UIGestureRecognizerAccess coalesced touchesMake rendering fast and efficientUse predicted touches

Page 69: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Apple Pencil

Page 70: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Touch typesApple Pencil

public var type: UITouchType { get }

Page 71: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Touch typesApple Pencil

public var type: UITouchType { get }

enum UITouchType : Int { case direct case indirect case stylus }

Page 72: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Higher precisionApple Pencil

func preciseLocation(in view: UIView?) -> CGPoint

func precisePreviousLocation(in view: UIView?) -> CGPoint

Page 73: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

public var force: CGFloat { get }

public var maximumPossibleForce: CGFloat { get }

Device Range

iPhone 6s (Plus) 0.0 - maximumPossibleForce

Apple Pencil on iPad Pro 0.0 - maximumPossibleForce

Touch on iPad Pro and all previous devices 0.0

ForceApple Pencil and 3D Touch

Page 74: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

ForceApple Pencil and 3D Touch

func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent)

func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent)

func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent)

func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent)

Page 75: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Tap recognitionApple Pencil and 3D Touch

func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent) {

cancelTap()

}

Use UITapGestureRecognizer

Page 76: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Add to the modelForce

struct StrokeSample { let location: CGPoint

}

Page 77: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Add to the modelForce

struct StrokeSample { let location: CGPoint

}

var force: CGFloat?

Page 78: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Width basedon force

Page 79: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

TiltApple Pencil

Page 80: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Altitude

TiltApple Pencil

Page 81: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

TiltApple Pencil

var altitudeAngle: CGFloat { get }

Page 82: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

OrientationApple Pencil

Page 83: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

OrientationApple Pencil

Page 84: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

OrientationApple Pencil

Page 85: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

OrientationApple Pencil

Page 86: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

OrientationApple Pencil

Azimuth

Page 87: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

AzimuthApple Pencil

func azimuthAngle(in view: UIView?) -> CGFloat

func azimuthUnitVector(in view: UIView?) -> CGVector

Page 88: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

ForceApple Pencil

Along axis

Page 89: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

ForceApple Pencil

Perpendicular todevice surface

Page 90: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

var perpendicularForce: CGFloat {

get {

return force / sin(altitudeAngle)

}

}

ForceApple Pencil

Page 91: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

var perpendicularForce: CGFloat {

get {

return force / sin(altitudeAngle)

}

}

ForceApple Pencil

min( , maximumPossibleForce)

Page 92: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

ForceApple Pencil

Page 93: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

Page 94: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

struct UITouchProperties : OptionSet {

}

Page 95: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

struct UITouchProperties : OptionSet {

static var force: UITouchProperties { get }

}

Page 96: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

struct UITouchProperties : OptionSet {

static var force: UITouchProperties { get }

static var azimuth: UITouchProperties { get }

static var altitude: UITouchProperties { get }

}

Page 97: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

struct UITouchProperties : OptionSet {

static var force: UITouchProperties { get }

static var azimuth: UITouchProperties { get }

static var altitude: UITouchProperties { get }

static var location: UITouchProperties { get } }

Page 98: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated propertiesApple Pencil

var estimatedProperties: UITouchProperties { get }

struct UITouchProperties : OptionSet {

static var force: UITouchProperties { get }

static var azimuth: UITouchProperties { get }

static var altitude: UITouchProperties { get }

static var location: UITouchProperties { get }

var estimatedPropertiesExpectingUpdates: UITouchProperties { get }

}

Page 99: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent)

func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent)

func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent)

func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent)

Page 100: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent)

func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent)

func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent)

func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent)

func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>)

Page 101: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Check estimatedPropertiesExpectingUpdates

Use estimationUpdateIndex as key to index your sample

Look up the estimationUpdateIndex intouchesEstimatedPropertiesUpdated(_:)

Some updates will arrive after touchesEnded:

Estimated properties with updatesApple Pencil

Page 102: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

}

}

Page 103: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

let estimationIndex = touch.estimationUpdateIndex!

}

}

Page 104: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

let estimationIndex = touch.estimationUpdateIndex!

let (sample, sampleIndex) = samplesExpectingUpdates[estimationIndex]

}

}

Page 105: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

let estimationIndex = touch.estimationUpdateIndex!

let (sample, sampleIndex) = samplesExpectingUpdates[estimationIndex]

let updatedSample = updatedSample(with: touch)

}

}

Page 106: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

let estimationIndex = touch.estimationUpdateIndex!

let (sample, sampleIndex) = samplesExpectingUpdates[estimationIndex]

let updatedSample = updatedSample(with: touch)

stroke.update(sample: updatedSample, at: sampleIndex)

}

}

Page 107: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Estimated properties with updatesApple Pencil

override func touchesEstimatedPropertiesUpdated(_ touches: Set<UITouch>) { for touch in touches {

let estimationIndex = touch.estimationUpdateIndex!

let (sample, sampleIndex) = samplesExpectingUpdates[estimationIndex]

let updatedSample = updatedSample(with: touch)

stroke.update(sample: updatedSample, at: sampleIndex)

if touch.estimatedPropertiesExpectingUpdates == [] {

samplesExpectingUpdates.removeValue(forKey: sampleIndex)

}

}

}

Page 108: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Azimuth

Page 109: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far
Page 110: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

CanvasFinishing Touches

84

Page 111: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

CanvasFinishing Touches

84

Page 112: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

CanvasFinishing Touches

84

Page 113: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Adjusting gesturesFinishing Touches

Scroll view UIPanGestureRecognizer vs. StrokeGestureRecognizerDisable scrolling with Apple Pencil

class UIGestureRecognizer { public var allowedTouchTypes: [NSNumber]}

let pan = scrollView.panGestureRecognizer

pan.allowedTouchTypes = [UITouchType.direct.rawValue as NSNumber]

strokeRecognizer.allowedTouchTypes = [UITouchType.stylus.rawValue as NSNumber]

Page 114: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Adjusting gesturesFinishing Touches

class UIGestureRecognizer {

public var requiresExclusiveTouchType: Bool

}

Page 115: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Summary

New properties of UITouchCoalesced and predicted touchesProperty estimationAdjusting gestures

Page 116: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

1024 x 768

Page 117: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

1024 x 768

Page 118: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

More Information

https://developer.apple.com/wwdc16/220

Page 119: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Related Sessions

Controlling Game Input for Apple TV Mission Wednesday 5:00PM

A Peek at 3D Touch Presidio Thursday 4:00PM

Advanced Touch Input on iOS WWDC 2015

Page 120: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far

Labs

UIKit and UIKit Animations Lab Frameworks Lab C Thursday 1:00PM

Cocoa Touch and 3D Touch Lab Frameworks Lab C Friday 10:30AM

Page 121: Leveraging Touch Input on iOS - Apple Inc.3D Touch A Peek at 3D Touch Presidio Thursday 4:00PM. iPad Air 2 and iPad Pro Faster Touch Scanning. iPad Pro ... What Have We Seen so Far