我在 UIButton
中有许多 UIViewController
实例,我想在用压力(一直向下)按下这些按钮中的任何一个时执行一些操作,我不知道这里的确切术语(可能是强制触摸?) .
因此,当 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/
用触觉/触觉反馈对此类“强制触摸”使用react也是一种很好的做法,因此用户将体验到触摸:
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.prepare()
generator.impactOccurred()
你可能想看看这篇文章的详细信息:
http://www.mikitamanko.com/blog/2017/01/29/haptic-feedback-with-uifeedbackgenerator/
关于ios - 在 UIButton 上对 3D Touch 执行操作的最佳方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40827691/