Подтвердить что ты не робот

Проверьте, поддерживается ли 3D-сенсор и включено ли его на устройстве iOS9

Я попытался получить доступ к коллекции признаков и проверить "forceTouchCapability", но "forceTouchCapability" просто проверяет, является ли устройство iOS 9.0 или выше.

Итак, это означает, что на любом устройстве с iOS 9 принудительное нажатие "доступно". Мне нужно проверить, действительно ли поддерживается 3D-сенсор на устройстве пользователя (iPhone 6s), и мне нужно убедиться, что опция 3D-Touch действительно включена в настройках доступности.

4b9b3361

Ответ 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
}