ios9 - taptic - ios 9 iphone 6S Juega retroalimentación háptica o vibra
taptic engine iphone 7 (5)
A partir de iOS 10 , hay una nueva API pública para manejar la retroalimentación háptica: UIFeedbackGenerator
.
let generator = UINotificationFeedbackGenerator()
generator.notificationOccurred(.success)
Se sugiere llamar a .prepare()
antes de usar el generador y enviar la retroalimentación ya que hay un ligero retraso entre los dos debido a que el hardware de retroalimentación requiere una "activación". Esto se puede hacer en viewDidLoad()
o algo comparable si está esperando que la retroalimentación se dé poco después.
Consulte este blog para obtener una buena explicación de la nueva API y los comentarios disponibles:
https://www.hackingwithswift.com/example-code/uikit/how-to-generate-haptic-feedback-with-uifeedbackgenerator
Para iOS 9 y versiones anteriores , puede usar AudioToolBox como se describe en las otras publicaciones.
import AudioToolbox
private let isDevice = TARGET_OS_SIMULATOR == 0
func vibrate() {
if isDevice {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
}
}
Una vez que el usuario fuerza el toque, quiero que el teléfono vibre como el comportamiento predeterminado.
¿Es háptico? Si es así, ¿cómo voy a hacer?
Creo que estás hablando del nuevo motor Taptic.
Desde apple.com: iPhone 6s le brinda comentarios en tiempo real tanto en pantalla como en forma de toques sutiles desde el motor Taptic . Estas respuestas corresponden a la profundidad con la que presiona la pantalla y le permiten saber qué acciones está realizando y qué puede esperar que ocurra.
Como sé, en realidad no hay una API pública para eso. Solo he encontrado este tutorial para implementar los comentarios de Taptic a través de la API privada.
//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)];
Ejemplo en Swift (para 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)
Por si acaso, aquí hay ejemplos para iPhone 7/7 + .
En cuanto al toque de fuerza, primero debes detectar si está disponible:
func is3dTouchAvailable(traitCollection: UITraitCollection) -> Bool {
return traitCollection.forceTouchCapability == UIForceTouchCapability.available
}
y luego en eventos táctiles, estará disponible como 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 {
// ...
}
}
Aquí está mi blog con un ejemplo más detallado con ejemplos de código:
http://www.mikitamanko.com/blog/2017/02/01/swift-how-to-use-3d-touch-introduction/
Hay diferentes tipos de comentarios. Pruebe cada uno de ellos para descubrir qué es mejor para sus necesidades:
// 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()
Puedes usar lógica personalizada para lograr esto:
- Detecte una fuerza aplicada en la pantalla por un usuario, usando las propiedades
force
ymaximumPossibleForce
de la claseUITouch
. - Dependiendo de la cantidad de fuerza, puede vibrar el dispositivo después de un nivel particular.
Ejemplo:
- (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");
}
}
- Además, puede intentar establecer diferentes duraciones de vibración para diferentes niveles de fuerza con lógica personalizada.
Ejemplo:
// 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);
}