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

10-14 12:20