Проверьте, поддерживается ли 3D-сенсор и включено ли его на устройстве iOS9
Я попытался получить доступ к коллекции признаков и проверить "forceTouchCapability", но "forceTouchCapability" просто проверяет, является ли устройство iOS 9.0 или выше.
Итак, это означает, что на любом устройстве с iOS 9 принудительное нажатие "доступно". Мне нужно проверить, действительно ли поддерживается 3D-сенсор на устройстве пользователя (iPhone 6s), и мне нужно убедиться, что опция 3D-Touch действительно включена в настройках доступности.
Ответы
Ответ 1
Я случайно нажал forceTouchCapability
на BOOL
(используя его как возвращаемое значение для моего метода, который был настроен на возврат логического). Мне нужно было проверить, равен ли forceTouchCapability
UIForceTouchCapabilityAvailable
.
Вместо:
return [[MyView traitCollection] forceTouchCapability];
Мне нужно:
return [[MyView traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable;
Ответ 2
Если вы реализуете это в 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");
}
}
Ответ 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)]
и [MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)]
.
Если вы сохраните первую проверку, приложение отлично работает на iOS 7, но сбой в iOS 8.
В принципе, Apple представила свойство traitCollection
в 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
Иногда мы хотим просто иметь значение forceTouchCapability
прямо сейчас синхронно и не хотим ждать события traitCollectionDidChange:
. В этом случае мы можем использовать довольно тупую функцию, подобную этой:
public func forceTouchCapability() -> UIForceTouchCapability {
return UIApplication.sharedApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown
}