如何区分用户是用手指还是苹果铅笔敲击屏幕?

7
该应用支持iPad Pro,并且需要与Apple Pencil配合使用。我想要做的是区分用户是使用Apple Pencil还是手指。
类似于以下内容:
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
}

我找到了UITouchTypeStylus属性,但不知道它是如何工作的。
我的主要问题是,很少有例子,而且它们都是用Swift编写的,但我正在使用Objective-C。我真的无法理解这些示例。
看看这个,这是我在苹果开发者网站上找到的一个示例函数:
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

        [...]
}

很不幸,我现在没有时间学习Swift……这完全阻碍了我的进展。

所以如果有人能提供一些Objective C的示例代码,使我能够使用Apple Pencil或开始使用它那就太好了。一个网站上的教程也是完美的,但我认为没有这样的资源。

2个回答

13

在Objective-C中,检查UITouch是否使用触控笔触摸类型的方法如下:

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

如果您不直接处理触摸事件,而是使用手势识别器,则会变得更加复杂。

您可以尝试添加第二个长按手势识别器,并将每个手势识别器的allowedTouchTypes属性设置为识别笔或直接触摸:

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

如果那不起作用,你将需要为长按手势添加一个委托,在 gestureRecognizer:shouldReceiveTouch: 方法中检查并存储触摸类型,并在手势动作触发时使用它。


它在 touch 上显示了一个错误:“使用未声明的标识符 touch”,我该如何解决这个问题? - Kokodelo
我假设您已经有了一个方法,其中包含一个或多个 UITouch 对象,示例代码仅用于测试触摸类型,这也是您所要求的。 - jrturton
从现在开始,我只是在我的应用程序上使用手指,现在我必须实现Apple Pencil。 所以,不好意思,我没有这个。 你能告诉我一下如何使用这个UITouch对象吗? - Kokodelo
将上述测试添加到您已经用于处理手指触摸的代码中,以允许您决定它是手指还是触笔。如果您已经有现有的触摸处理代码,那么最好将其放入问题中。如果没有,则您就提出了错误的问题。 - jrturton
你是在说类似于GestureRecognizer的东西吗?实际上,我正在使用UILongPressGestureRecognizer来打开一个对象的编辑窗口。所以如果是手指,它会显示一个窗口,如果是铅笔,它会显示另一个窗口。你现在更好地理解我的问题了吗?(这里好像有个错误,抱歉) - Kokodelo

1
在iOS 9.1中,UITouch类具有touch属性,该属性返回以下类型:
typedef enum {
    UITouchTypeDirect,
    UITouchTypeIndirect,
    UITouchTypeStylus       // THIS ONE
} UITouchType;

是的,您需要测试触摸对象的属性,但不需要添加该声明。 - trojanfoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接