检查iOS9设备是否支持并启用3D触摸

我尝试访问trait集合并检查“forceTouchCapability”,但“forceTouchCapability”只是检查设备是否为iOS 9.0或更高版本。

所以,这意味着在任何使用iOS 9的设备上,强制触摸是“可用的”。 我需要一种方法来检查在用户设备(iPhone 6s)上是否实际支持3D touch,并且我需要确保在辅助function设置中实际启用了3D Touch选项。

我不小心铸造了forceTouchCapability到一个BOOL (使用它作为返回值来设置我的方法返回一个布尔值)。 我需要检查forceTouchCapability是否等于UIForceTouchCapabilityAvailable

代替:

 return [[MyView traitCollection] forceTouchCapability]; 

我需要:

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

如果你在UIViewController实现这个,时间很重要。 在viewDidLoad返回时将返回Unknown 。在生命周期的稍后阶段Available

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

我的意思是,如果你还支持iOS 7iOS 8 ,请记住检查两个条件: [MyView respondsToSelector:@selector(traitCollection)][MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)]

如果保持第一次检查,应用程序在iOS 7上工作正常,但在iOS 8上崩溃。基本上,Apple在iOS 8中引入了traitCollection属性,但仅在iOS 9中添加了forceTouchCapability属性。

来自UITraitCollection.h

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

PS:在应用程序开始在App Store上崩溃之后,我们学到了这个难题。

有时候我们只想同时拥有forceTouchCapability值,而不想等待traitCollectionDidChange: event。 在这种情况下,我们可以使用这样的非常愚蠢的function:

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