2015-09-29 7 views

Antwort

1

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)]; 
+0

Die private API funktioniert nicht. – mayqiyue

0

können Sie benutzerdefinierte Logik verwenden, um dies zu erreichen:

  • eine Kraft erkennen auf dem Bildschirm durch einen Benutzer angewendet, durch force und maximumPossibleForce Eigenschaften von UITouch Klasse.
  • Je nach Kraftbetrag können Sie das Gerät nach einer bestimmten Stufe vibrieren lassen.

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"); 
    } 
} 
  • Außerdem können Sie versuchen, mit eigener Logik für unterschiedliches Kraftniveau unterschiedliche Schwingungsdauer einzustellen.

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

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) 
    } 
} 
+1

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

+0

@bendytree Danke für das Hinzufügen der neuen Unterklassen, ich sehe mir hier nicht immer ältere Beiträge an :) –

9

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/

+0

Die 1519-1521 Codes scheinen hier nicht mehr zu gelten. Hatten Sie Probleme? @ Mikita Manko –

1

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() 
Verwandte Themen