web-dev-qa-db-ja.com

ios 9 iphone6S触覚フィードバックを再生するか振動する

ユーザーが感圧タッチした後、デフォルトの動作と同じように電話を振動させたいです。

触覚ですか?もしそうなら、どうすればいいですか?

19
Khant Thu Linn

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/

14
Mikita Manko

iOS 10から、触覚フィードバックを処理するための新しいパブリックAPIがあります: UIFeedbackGenerator

_let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
_

ジェネレーターを使用してフィードバックを送信する前に、.prepare()を呼び出すことをお勧めします。これは、フィードバックハードウェアが「ウェイクアップ」を必要とするため、2つの間にわずかな遅延があるためです。これは、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)
    }
}
_

さまざまなフィードバックタイプがあります。それぞれを試して、ニーズに適したものを見つけてください。

// 1, 2, 3
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.error)
generator.notificationOccurred(.success)
generator.notificationOccurred(.warning)

// 4
let generator = UIImpactFeedbackGenerator(style: .light)
generator.impactOccurred()

// 5
let generator = UIImpactFeedbackGenerator(style: .medium)
generator.impactOccurred()

// 6
let generator = UIImpactFeedbackGenerator(style: .heavy)
generator.impactOccurred()

// 7
let generator = UISelectionFeedbackGenerator()
generator.selectionChanged()
5

あなたは新しいタプティックエンジンについて話していると思います。

Apple.comから:iPhone 6sは、画面上とTaptic Engineからの微妙なタップの形でリアルタイムのフィードバックを提供します)。これらの応答は、ディスプレイをどれだけ深く押しているかに対応し、実行しているアクションと予想されるアクションを通知します。

私が知っているように、実際にはそのためのパブリックAPIはありません。プライベート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)];
1
andreacipriani

カスタムロジックを使用して、これを実現できます。

  • 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);
}
0
Mahesh K