Verifica si el 3D touch es compatible y habilitado en el dispositivo iOS9.

Traté de acceder a la colección de rasgos y controlo "forceTouchCapability", pero "forceTouchCapability" simplemente comtesting si el dispositivo es iOS 9.0 o superior.

Entonces, esto significa que en cualquier dispositivo con iOS 9, la fuerza táctil está 'disponible'. Necesito una forma de comprobar si el toque 3D es realmente compatible con el dispositivo de los usuarios (iPhone 6s) y tengo que asegurarme de que la opción 3D Touch esté realmente habilitada en la configuration de accesibilidad.

Estuve accidentalmente lanzando forceTouchCapability a un BOOL (utilizándolo como un valor de retorno a mi método que se configuró para devolver un boolean). Necesitaba verificar si forceTouchCapability era igual a UIForceTouchCapabilityAvailable .

En lugar de:

 return [[MyView traitCollection] forceTouchCapability]; 

Necesito:

 return [[MyView traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable; 

Si implementa esto en UIViewController , el momento es importante. Al viewDidLoad en la viewDidLoad , viewDidLoad devolverá Unknown cuando regrese Available más adelante en el ciclo de vida.

 - (void)traitCollectionDidChange:(nullable UITraitCollection *)previousTraitCollection { [self checkForForceTouch]; } - (void)checkForForceTouch { if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)] && self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) { NSLog(@"Force touch found"); } } 
 if ([MyView respondsToSelector:@selector(traitCollection)] && [MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)] && MyView.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) { return YES; } 

Mi punto es que si también respalda iOS 7 y iOS 8 , recuerde verificar las condiciones: [MyView respondsToSelector:@selector(traitCollection)] y [MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)] .

Si mantienes el primer cheque, la aplicación funciona bien en iOS 7 pero falla en iOS 8. Básicamente, Apple introdujo la propiedad traitCollection en iOS 8, pero agregó la propiedad forceTouchCapability solo en iOS 9.

de UITraitCollection.h :

 @property (nonatomic, readonly) UITraitCollection *traitCollection NS_AVAILABLE_IOS(8_0); @property (nonatomic, readonly) UIForceTouchCapability forceTouchCapability NS_AVAILABLE_IOS(9_0); 

PD: Aprendí de la manera más difícil, después de que la aplicación comenzó a fallar en la App Store.

A veces queremos tener el valor de forceTouchCapability ahora sincrónicamente y no queremos esperar a traitCollectionDidChange: event. En ese caso, podemos usar una function bastante estúpida como esta:

 public func forceTouchCapability() -> UIForceTouchCapability { return UIApplication.shanetworkingApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown }