ios 9 iphone 6S播放触觉反馈或振动

时间:2015-09-29 10:11:52

标签: ios9 3dtouch

用户强行触摸后,我想像默认行为一样振动手机。

是触觉吗?如果是这样,我该怎么办?

5 个答案:

答案 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类的maximumPossibleForceUITouch属性检测用户在屏幕上施加的力。
  • 根据力量,您可以在特定级别后振动设备。

示例:

- (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);
}