ユーザーが感圧タッチした後、デフォルトの動作と同じように電話を振動させたいです。
触覚ですか?もしそうなら、どうすればいいですか?
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/
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()
あなたは新しいタプティックエンジンについて話していると思います。
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)];
カスタムロジックを使用して、これを実現できます。
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);
}