检查iOS9设备是否支持3D触控并启用

时间:2015-09-28 00:54:24

标签: ios iphone 3dtouch

我尝试访问特征集合并检查“forceTouchCapability”,但“forceTouchCapability”只是检查设备是否为iOS 9.0或更高版本。

因此,这意味着在iOS 9的任何设备上,强制触摸都是“可用的”。我需要一种方法来检查用户设备(iPhone 6s)上是否实际支持3D触摸,我需要确保在辅助功能设置中实际启用了3D Touch选项。

6 个答案:

答案 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
}