ios – 在UIButton上对3D Touch执行操作的最佳方式

我在UIViewController中有许多UIButton实例,我想在压力按下这些按钮时一直执行一些操作(一直向下),我不知道这里的确切术语(强制触摸可能吗?) .

因此,当UIButton受到压力时,我想通过振动提供触觉反馈,更改按钮图像源并执行其他操作.然后当压力释放时,我想将按钮图像源恢复到正常状态并做更多的事情.

最简单的方法是什么?

我应该像下面那样制作我自己的自定义UIButton,还是可以覆盖“按下”和“已发布”3D触摸的方法.

到目前为止,这是我自定义的UIButton代码.我应该通过反复试验确定最大力量应该是多少?另外,我如何以最简单的方式更改每个按钮的图像来源?

import AudioToolbox
import UIKit

class customButton : UIButton {
    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        for touch in touches {
            print("% Touch pressure: \(touch.force/touch.maximumPossibleForce)");
            if touch.force > valueThatIMustFindOut {
                AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
                // change image source
                // call external function
            }
        }
    }

    override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
        print("Touches End")
        // restore image source
        // call external function
    }
}

请注意,我是Swift的新手,所以我想使用Xcode中的图形界面尽可能地创建用户界面.所以我想避免从代码中创建UI.

最佳答案 至于力触摸 – 您需要先检测它是否可用:

func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool {
    return traitCollection.forceTouchCapability == UIForceTouchCapability.available
}

if(is3dTouchAvailable(traitCollection: self.view!.traitCollection)) {
   //...
}

然后在例如touchesMoved它将作为touch.force和touch.maximumPossibleForce提供

func touchMoved(touch: UITouch, toPoint pos: CGPoint) {
    let location = touch.location(in: self)
    let node = self.atPoint(location)

    //...
    if is3dTouchEnabled {
        bubble.setPressure(pressurePercent: touch.force / touch.maximumPossibleForce)
    } else {
        // ...
    }
}

以下是代码示例的更详细示例:
http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/

使用触觉/ taptic反馈对这种“力量触摸”作出反应也是一种很好的做法,因此用户将体验到触摸:

let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()

generator.impactOccurred()

你可能想看一下这篇文章的详细信息:
http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/

点赞