Ios 9 iphone 6S Play Haptic обратная связь или вибрация

Когда пользователь нажимает, я хочу вибрировать телефон так же, как поведение по умолчанию.

Это тактично? Если да, то как мне это сделать?

Ответы

Ответ 1

Пример в 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/

Ответ 2

Начиная с iOS 10, существует новый открытый API для обработки тактической обратной связи: UIFeedbackGenerator.

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

Рекомендуется использовать .prepare() перед использованием генератора и отправкой обратной связи, поскольку между ними возникает небольшая задержка из-за оборудования обратной связи, требующего "пробуждения". Это можно сделать в 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)
    }
}

Ответ 3

Я думаю, что вы говорите о новом Taptic Engine.

От apple.com: iPhone 6s дает вам обратную связь в реальном времени как на экране, так и в виде тонких кранов от Taptic Engine. Эти ответы соответствуют тому, как глубоко вы нажимаете на дисплей, и они позволяют вам знать, какие действия вы выполняете и что вы можете ожидать.

Как я знаю, для этого нет публичного API. Я нашел этот учебник для реализации обратной связи Taptic через частный 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)];

Ответ 4

Существуют разные типы обратной связи. Попробуйте каждый, чтобы выяснить, что лучше для ваших нужд:

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

Для достижения этой цели вы можете использовать пользовательскую логику:

  • Определите силу, применяемую пользователем на экране, используя свойства 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);
}