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

Posted

技术标签:

【中文标题】如何区分用户是用手指还是苹果铅笔点击屏幕?【英文标题】:How to differentiate whether a user is tapping the screen with his finger or an apple pencil? 【发布时间】:2016-09-05 02:52:53 【问题描述】:

该应用程序支持 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,或者只是一个开始。网站上的教程也很完美,但我认为没有。

【问题讨论】:

【参考方案1】:

检查 UITouch 是否在 Objective-C 中使用手写笔触摸类型:

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

如果您不直接处理触摸,而是使用手势识别器,那么它会稍微复杂一些。

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

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

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

【讨论】:

触摸时显示错误:“使用未声明的标识符触摸”,我该如何解决? 好吧,我假设您已经有一个方法,其中您有一个或多个 UITouch 对象,示例代码仅用于测试您所要求的触摸类型。 从现在开始我只是在我的应用程序上使用手指,现在我必须实现 Apple Pencil。所以不,对不起,我没有这个。你能告诉我应该如何使用这个 UITouch 对象吗? 您将上面的测试添加到您已经用于处理手指触摸的代码中,以允许您确定它是手指还是手写笔。如果您有现有的触摸处理代码,那么最好将其放在问题中。如果你不这样做,那么你问错了问题。 您说的是 GestureRecognizer 之类的东西吗?实际上,我正在使用 UILongPressGestureRecognizer 打开对象的编辑窗口。因此,如果是手指,它将显示一个窗口,如果是铅笔,它将显示另一个窗口。您是否更好地理解了我的问题? (这里好像有错误对不起)【参考方案2】:

ios 9.1 中的UITouch 类有一个touch 属性,它返回类型:

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

【讨论】:

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

以上是关于如何区分用户是用手指还是苹果铅笔点击屏幕?的主要内容,如果未能解决你的问题,请参考以下文章

flutter web中如何区分手指触摸手势和鼠标指针手势?

Unity区分安卓,苹果是平板还是手机

识别拖动与点击操作之zepto的bug

如何检测 UICollectionView 上的触摸?

如何区分本地用户和域用户,这些用户是我的凭据提供程序的登录屏幕上缓存的磁贴

如何区分用户滑动和点击动作?