【问题标题】: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,或者只是一个开始。网站上的教程也很完美,但我认为没有。

【问题讨论】:

    标签: ios objective-c stylus-pen 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;
    

    【讨论】:

    • 是的,您需要测试触摸对象的属性,但您不需要添加该声明,不。
    猜你喜欢
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    相关资源
    最近更新 更多