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