swift - iOS 键盘扩展中屏幕左侧的动画延迟

标签 swift core-animation ios-app-extension

我正在为 iOS 开发键盘扩展。但是,我遇到了一些奇怪的问题,动画/层没有立即出现在屏幕的最左侧。当用户按下某个键时,我使用图层/动画来显示“工具提示”。对于除 A 和 Q 之外的所有键,工具提示都会立即显示,但是对于这两个键,在图层和动画出现之前似乎有轻微的延迟。这只发生在触地时,如果我滑入 Q 或 A 命中区域,工具提示会立即呈现。我的调试显示代码对所有键的执行完全相同,但是对于这两个键它没有立即生效。

关于屏幕左边缘是否有任何可能导致此行为的特殊情况,您有什么想法吗?还是我做了一些愚蠢的事情,这可能是造成这种情况的原因?

这是触发工具提示渲染的触摸处理代码的一部分:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if(!shouldIgnoreTouches()) {
        for touch in touches {
            let location = (touch ).locationInView(self.inputView)

            // pass coordinates to offset service to find candidate keys
            let keyArray = keyOffsetService.getKeys(_keyboardLayout!, location: location)
            let primaryKey = keyArray[0]

            if primaryKey.alphaNumericKey != nil {
                let layers = findLayers(touch )

                if layers.keyLayer != nil {
                    graphicsService.animateKeyDown(layers.keyLayer as! CATextLayer, shieldLayer: layers.shieldLayer)
                    _shieldsUp.append((textLayer:layers.keyLayer, shieldLayer:layers.shieldLayer))
                }
            }
         }
    }
}

动画代码:

func animateKeyDown(layer:CATextLayer, shieldLayer:CALayer?) {
    if let sLayer = shieldLayer {
        keyDownShields(layer, shieldLayer: sLayer)
        CATransaction.begin()
        CATransaction.setDisableActions(true)

        let fontSizeAnim = CABasicAnimation(keyPath: "fontSize")
        fontSizeAnim.removedOnCompletion = true
        fontSizeAnim.fromValue = layer.fontSize
        fontSizeAnim.toValue = layer.fontSize * 0.9
        layer.fontSize = layer.fontSize * 0.9

        let animation  = CABasicAnimation(keyPath: "opacity")
        animation.removedOnCompletion = true
        animation.fromValue = layer.opacity
        animation.toValue = 0.3
        layer.opacity = 0.3

        let animGroup = CAAnimationGroup()
        animGroup.animations = [fontSizeAnim, animation]
        animGroup.duration = 0.01
        layer.addAnimation(animGroup, forKey: "down")

        CATransaction.commit()
    }
}

取消隐藏工具提示层:

private func keyDownShields(layer:CATextLayer, shieldLayer:CALayer) {
    shieldLayer.hidden = false
    shieldLayer.setValue(true, forKey: "isUp")
    shieldLayer.zPosition = 1
    shieldLayer.removeAllAnimations()
    layer.setValue(true, forKey: "isUp")
}

Image of the keyboard with tooltip

最佳答案

这是由 iOS 9 中的一项功能引起的,该功能允许用户在向右滑动的同时用力按下屏幕的左边缘来切换应用。

您可以通过禁用 3D 触摸来关闭它,但这不是解决方案。

我不知道有任何 API 允许您覆盖此行为。

关于swift - iOS 键盘扩展中屏幕左侧的动画延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37196205/

相关文章:

ios - '[CFString! ]' is not convertible to ' [字符串]'

iphone - 在 CALayer 的 mask 区域周围添加阴影

ios - 手动动画 UIScrollView.contentOffset 时背景图案跳跃

ios 8 自定义键盘 UIViewServiceInterfaceErrorDomain?

xcode - 在同一打印语句中打印出多个变量

arrays - 按日期快速过滤数组

ios - UIKeyboardWillHideNotification 上无法识别的选择器

objective-c - iOS 核心动画加速

ios - iOS 键盘扩展可以访问钥匙串(keychain)吗?

ios - 如何访问 private/var 文件夹中的文件?