How to differentiate whether a user is tapping the screen with his finger or an apple pencil?

3.3k Views Asked by At

The App supports iPad Pro and it has to work with the Apple Pencil. What I would like to do is to differentiate whether the user is using the Apple Pencil or his finger.

Something like:

if( the user is pressing the screen with his finger){
    do something
} else if ( the user is pressing the screen with an Apple Pencil){
    do something else
}

I found the UITouchTypeStylus attribute but was not able to know how it works.

My main problem is that there are really few examples, and they are written in swift, but I am working in objective C. And I am not able to really understand these samples.

Look at this, this is a function from a sample that I found on the apple developer:

func addPointsOfType(var type: LinePoint.PointType, forTouches touches: [UITouch], toLine line: Line, currentUpdateRect updateRect: CGRect) -> CGRect {
    var accumulatedRect = CGRect.null

    for (idx, touch) in touches.enumerate() {
        let isStylus = touch.type == .Stylus // I think that what I'm looking for is something like that

        [...]
}

I don't really have the time to learn swift now, unfortunately... This is blocking me completely.

So if someone could give me some samples in Objective C that will allow me to work with the Apple Pencil, or just a beginning. A tutorial on a web site would be perfect also but I don't think there are any.

2

There are 2 best solutions below

5
On BEST ANSWER

To check if a UITouch is using the stylus touch type in Objective-C:

if (touch.type == UITouchTypeStylus) {
    // Do stuff
}

If you're not handling touches directly, but using a gesture recognizer, then it is a little more complicated.

You could try adding a second long press gesture recogniser and setting the allowedTouchTypes property on each one to recognise stylus or direct touches:

longPressGestureFinger.allowedTouchTypes = @[@(UITouchTypeDirect)];
longPressGesturePencil.allowedTouchTypes = @[@(UITouchTypeStylus)];

If that doesn't work, you would have to add a delegate to the long press gesture, and in the gestureRecognizer: shouldReceiveTouch: method, check and store the type of touch and use this when the gesture action fires.

1
On

The UITouch class in iOS 9.1 has a touch property which returns the type:

typedef enum {
    UITouchTypeDirect,
    UITouchTypeIndirect,
    UITouchTypeStylus       // THIS ONE
} UITouchType;