Nachdem Benutzer Touch, ich möchte Telefon wie Standardverhalten vibrieren.ios 9 iphone 6S Spielen Haptische Rückmeldung oder vibrieren
Ist es haptisch? Wenn ja, wie soll ich tun?
Nachdem Benutzer Touch, ich möchte Telefon wie Standardverhalten vibrieren.ios 9 iphone 6S Spielen Haptische Rückmeldung oder vibrieren
Ist es haptisch? Wenn ja, wie soll ich tun?
Ich denke, dass Sie über die neue Taptic Engine sprechen.
Von apple.com: iPhone 6s gibt Ihnen Echtzeit-Feedback sowohl auf dem Bildschirm als auch in Form von feinen Wasserhähnen aus dem Taptic Motor. Diese Antworten geben an, wie stark Sie das Display drücken, und Sie wissen, welche Aktionen Sie ausführen und was Sie erwarten können.
Wie ich weiß, gibt es keine öffentliche API dafür. Ich habe nur gefunden this tutorial für die Umsetzung der Taptic Feedback über private API.
//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)];
können Sie benutzerdefinierte Logik verwenden, um dies zu erreichen:
force
und maximumPossibleForce
Eigenschaften von UITouch
Klasse.Beispiel:
- (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");
}
}
Beispiel:
// 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);
}
mit iOS 10 Ab, gibt es eine neue öffentliche API für haptisches Feedback Handhabung: UIFeedbackGenerator
.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
Es wird vorgeschlagen, .prepare()
aufrufen, bevor der Generator und das Senden der Rückmeldung mit, da es zwischen den beiden aufgrund der Feedback-Hardware erfordert eine „Wake-up“ eine leichte Verzögerung ist. Dies könnte in viewDidLoad()
oder etwas vergleichbares getan werden, wenn Sie erwarten, dass das Feedback kurz danach gegeben wird.
Sehen Sie dieses Blog für eine gute Erklärung der neuen API und die verfügbaren Feedback:
https://www.hackingwithswift.com/example-code/uikit/how-to-generate-haptic-feedback-with-uifeedbackgenerator
Für iOS 9 und älter Sie AudioToolBox in den anderen Beiträgen wie skizziert nutzen könnten.
import AudioToolbox
private let isDevice = TARGET_OS_SIMULATOR == 0
func vibrate() {
if isDevice {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
}
}
Zusätzliche haptische Klassen in iOS 10: [UIImpactFeedbackGenerator] (https://developer.apple.com/documentation/uikit/uiimpactfeedbackgenerator) und [UISelectionFeedbackGenerator] (https://developer.apple.com/documentation/uikit/uiselectionfeedbackgenerator) – bendytree
@bendytree Danke für das Hinzufügen der neuen Unterklassen, ich sehe mir hier nicht immer ältere Beiträge an :) –
Beispiel in Swift (für 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)
Nur für den Fall - here're Beispiele für iPhone 7/7+.
Was die Kraft touch - müssen Sie erkennen, ob es zuerst verfügbar ist:
func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool {
return traitCollection.forceTouchCapability == UIForceTouchCapability.available
}
und dann in Kontakt Ereignisse, wird es als touch.force verfügbar sein
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 {
// ...
}
}
meine hier Blog mit einem detaillierteren Beispiel mit Codebeispielen:
http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/
Die 1519-1521 Codes scheinen hier nicht mehr zu gelten. Hatten Sie Probleme? @ Mikita Manko –
Es gibt verschiedene Feedback-Typen. Probieren Sie jedes aus, um herauszufinden, was besser für Ihre Bedürfnisse ist:
// 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()
Die private API funktioniert nicht. – mayqiyue