用户强行触摸后,我想像默认行为一样振动手机。
是触觉吗?如果是这样,我该怎么办?
答案 0 :(得分:13)
Swift中的示例(适用于iPhone 6S)
import AudioToolbox
AudioServicesPlaySystemSound(1519) // Actuate `Peek` feedback (weak boom)
AudioServicesPlaySystemSound(1520) // Actuate `Pop` feedback (strong boom)
AudioServicesPlaySystemSound(1521) // Actuate `Nope` feedback (series of three weak booms)
以防万一 - 以下是iPhone 7/7+的例子。
至于力触摸 - 您需要先检测它是否可用:
func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool {
return traitCollection.forceTouchCapability == UIForceTouchCapability.available
}
然后在触摸事件中,它将以touch.force
的形式提供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/
答案 1 :(得分:12)
从 iOS 10 开始,有一个用于处理触觉反馈的新公共API:UIFeedbackGenerator
。
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
建议在使用发生器之前调用.prepare()
并发送反馈,因为反馈硬件需要"唤醒"两者之间存在轻微延迟。这可以在viewDidLoad()
或类似的内容中完成,如果您希望不久之后能够提供反馈。
有关新API和可用反馈的详细说明,请参阅此博客:
https://www.hackingwithswift.com/example-code/uikit/how-to-generate-haptic-feedback-with-uifeedbackgenerator
对于iOS 9及更早版本,您可以使用其他帖子中概述的AudioToolBox。
import AudioToolbox
private let isDevice = TARGET_OS_SIMULATOR == 0
func vibrate() {
if isDevice {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
}
}
答案 2 :(得分:4)
有不同的反馈类型。尝试每一个,找出更适合您需求的东西:
np.bool(np.nan) & np.bool(False)
答案 3 :(得分:1)
我认为你在谈论新的Taptic Engine。
来自apple.com: iPhone 6s为您提供屏幕上的实时反馈,以及来自 Taptic Engine 的微妙点击。这些响应对应于您按下显示屏的程度,它们会让您知道您正在执行的操作以及您可能会发生的操作。
据我所知,实际上没有公共API。 我只找到this tutorial来通过私有API实现Taptic反馈。
//ATTENTION: This is a private API, if you use this lines of code your app will be rejected
id tapticEngine = [[UIDevice currentDevice] performSelector:NSSelectorFromString(@"_tapticEngine") withObject:nil];
[tapticEngine performSelector:NSSelectorFromString(@"actuateFeedback:") withObject:@(0)];
答案 4 :(得分:0)
您可以使用自定义逻辑来实现此目的:
force
类的maximumPossibleForce
和UITouch
属性检测用户在屏幕上施加的力。示例:
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [touches anyObject];
CGFloat maximumPossibleForce = touch.maximumPossibleForce;
CGFloat force = touch.force;
CGFloat normalizedForce = force/maximumPossibleForce;
NSLog(@"Normalized force : %f", normalizedForce);
if (normalizedForce > 0.75)
{
NSLog(@"Strong");
// Vibrate device
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}
else
{
NSLog(@"Weak");
}
}
示例:
// Vibrate device
NSTimer * vibrationTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(vibrateDevice) userInfo:nil repeats:YES];
- (void) vibrateDevice
{
if(duration == 2) // duration is a public variable to count vibration duration
{
// Stop the device vibration
[vibrationTimer invalidate];
return;
}
duration++;
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}