Pytanie ios 9 iphone 6S Odtwórz Haptyczne sprzężenie zwrotne lub wibracje


Gdy użytkownik wymusza dotyk, chcę wibrować telefon, tak jak domyślne zachowanie.

Czy to jest haptyczne? Jeśli tak, jak mam to zrobić?


18
2017-09-29 10:11


pochodzenie




Odpowiedzi:


Przykład w Swift (dla 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)

Na wszelki wypadek - oto przykłady dla iPhone 7/7 +.

Jeśli chodzi o siłę nacisku - musisz sprawdzić, czy jest on dostępny jako pierwszy:

func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool {
    return traitCollection.forceTouchCapability == UIForceTouchCapability.available
}

a następnie w wydarzeniach dotyku, będzie dostępny jako 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 {
        // ...
    }
}

Oto mój blog z bardziej szczegółowym przykładem z przykładami kodu:
http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/


11
2018-02-05 21:18



Kody 1519-1521 wydają się już tutaj nie mieć zastosowania. Czy zdarzyło Ci się natknąć na problemy? @Mikita Manko - Shai Mishali


Począwszy od iOS 10, istnieje nowy publiczny interfejs API do obsługi dotykowego sprzężenia zwrotnego: UIFeedbackGenerator.

let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)

Sugeruje się zadzwonić .prepare() przed użyciem generatora i wysłaniem informacji zwrotnej, ponieważ pomiędzy nimi występuje niewielkie opóźnienie ze względu na sprzęt sprzężenia zwrotnego wymagający "pobudki". Można to zrobić w viewDidLoad() lub coś podobnego, jeśli spodziewasz się, że informacje zwrotne zostaną wkrótce przekazane.

Zobacz ten blog, aby uzyskać dobre wyjaśnienie nowego interfejsu API i dostępnych informacji zwrotnych:
https://www.hackingwithswift.com/example-code/uikit/how-to-generate-haptic-feedback- with-uifeedbackgenerator

Na iOS 9 i starszemożesz użyć AudioToolBox zgodnie z opisem w innych wpisach.

import AudioToolbox

private let isDevice = TARGET_OS_SIMULATOR == 0

func vibrate() {
    if isDevice {
        AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
    }
}

8
2017-10-06 09:26



Dodatkowe zajęcia dotykowe w systemie iOS 10: UIImpactFeedbackGenerator i UISelectionFeedbackGenerator - bendytree
@bendytree Dzięki za dodanie nowych podklas, nie zawsze patrzę na starsze posty tutaj :) - Frederik A. Winkelsdorf


Istnieją różne rodzaje informacji zwrotnych. Wypróbuj każdą, aby dowiedzieć się, co jest lepsze dla Twoich potrzeb:

// 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()

4
2018-06-27 11:15





Myślę, że mówisz o nowym silniku Taptic.

Od apple.com: iPhone 6s zapewnia informacje zwrotne w czasie rzeczywistym zarówno na ekranie, jak i subtelne stuknięcia w Silnik Taptic. Odpowiedzi te odpowiadają na to, jak głęboko naciskasz wyświetlacz, i dają ci znać, jakie działania wykonujesz i czego możesz się spodziewać.

Jak już wiem, nie ma tam publicznego API. Znalazłem tylko w tym samouczku do implementacji sprzężenia zwrotnego Taptic poprzez prywatne 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)];

1
2017-11-09 15:22



Prywatny interfejs API nie działa. - mayqiyue


Aby to osiągnąć, możesz użyć niestandardowej logiki:

  • Wykryj siłę wywieraną na ekranie przez użytkownika, używając force i maximumPossibleForce właściwości UITouch klasa.
  • W zależności od wielkości siły możesz wibrować urządzenie po określonym poziomie.

Przykład:

- (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");
    }
}
  • Możesz także ustawić różne czasy wibracji dla różnych poziomów siły przy użyciu niestandardowej logiki.

Przykład:

// 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
2018-02-20 09:38