我试图访问特质集并检查“forceTouchCapability”,但是“forceTouchCapability”只是检查设备是否为iOS 9.0或更高版本。
这意味着在任何iOS 9设备上,都可使用触压功能。我需要一种方法来检查用户设备(iPhone 6s)是否实际支持3D Touch,并确保启用辅助功能设置中的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");
}
}
forceTouchCapability
的值,而不想等待traitCollectionDidChange:
事件。在这种情况下,我们可以使用类似于以下的非常愚蠢的函数来实现:public func forceTouchCapability() -> UIForceTouchCapability {
return UIApplication.sharedApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown
}
if ([MyView respondsToSelector:@selector(traitCollection)] &&
[MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)] &&
MyView.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
return YES;
}
我的意思是,如果你正在支持 iOS 7 和 iOS 8,请记得检查以下两个条件:[MyView respondsToSelector:@selector(traitCollection)]
和 [MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)]
。
如果只检查第一个条件,则应用程序可以在 iOS 7 上正常工作,但会在 iOS 8 上崩溃。
基本上,苹果在 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);
注意:我是在应用程序开始在应用商店崩溃之后才艰难地学会了这一点。
Swift 4.0和4.1。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Check device supports feature
if self.traitCollection.forceTouchCapability == .available {
// Enable 3D Touch feature here
} else {
// Fall back to other non 3D feature
}
}
override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
// Update the app's 3D Touch support
if self.traitCollection.forceTouchCapability == .available {
// Enable 3D Touch feature here
} else {
// Fall back to other non 3D feature
}
}
}
跟随 Valentin Shergin,如果您需要同步调用,则更新为 Swift 4.2:
func forceTouchCapability() -> UIForceTouchCapability {
return UIApplication.shared.keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .unknown
}
func hasForceTouchCapability() -> Bool {
return forceTouchCapability() == .available
}
BOOL
。 - rmaddy