我尝试访问特征集合并检查“forceTouchCapability”,但“forceTouchCapability”只是检查设备是否为 iOS 9.0 或更高版本。
因此,这意味着在任何装有 iOS 9 的设备上,强制触摸都是“可用的”。我需要一种方法来检查用户设备(iPhone 6s)是否实际支持 3D 触摸,并且我需要确保在辅助功能设置中实际启用了 3D 触摸选项。
我不小心将其转换forceTouchCapability
为 a 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 上崩溃。基本上,AppletraitCollection
在 iOS 8 中引入了属性,但forceTouchCapability
仅在 iOS 9 中添加了属性。
来自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 上崩溃之后,才学会了它。
斯威夫特 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
}