我在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/