我尝试访问特征集合并检查“forceTouchCapability”,但“forceTouchCapability”只是检查设备是否为iOS 9.0或更高版本。
因此,这意味着在iOS 9的任何设备上,强制触摸都是“可用的”。我需要一种方法来检查用户设备(iPhone 6s)上是否实际支持3D触摸,我需要确保在辅助功能设置中实际启用了3D Touch选项。
答案 0 :(得分:23)
我不小心将forceTouchCapability
转换为BOOL
(将其用作我设置为返回布尔值的方法的返回值)。我需要检查forceTouchCapability
是否等于UIForceTouchCapabilityAvailable
。
而不是:
return [[MyView traitCollection] forceTouchCapability];
我需要:
return [[MyView traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable;
答案 1 :(得分:12)
如果您在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");
}
}
答案 2 :(得分:3)
有时我们希望只是同步拥有forceTouchCapability
值并且不想等待traitCollectionDidChange:
事件。在这种情况下,我们可以使用这样的非常愚蠢的函数:
public func forceTouchCapability() -> UIForceTouchCapability {
return UIApplication.sharedApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown
}
答案 3 :(得分:3)
if ([MyView respondsToSelector:@selector(traitCollection)] &&
[MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)] &&
MyView.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
return YES;
}
我的观点是,如果您同时支持 iOS 7 和 iOS 8 ,请记住检查以下两个条件:[MyView respondsToSelector:@selector(traitCollection)]
和{{1 }}
如果您保持第一次检查,该应用程序在iOS 7上正常工作但在iOS 8上崩溃。
基本上,Apple在iOS 8中引入了[MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)]
属性,但仅在iOS 9中添加了traitCollection
属性。
来自 UITraitCollection.h :
forceTouchCapability
PS:在应用程序开始在App Store上崩溃之后,学到了很多东西。
答案 4 :(得分: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
}
}
}
答案 5 :(得分:0)
Valentin Shergin之后,如果需要同步通话,则更新为Swift 4.2:
func forceTouchCapability() -> UIForceTouchCapability {
return UIApplication.shared.keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .unknown
}
func hasForceTouchCapability() -> Bool {
return forceTouchCapability() == .available
}