14

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

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

4

6 回答 6

24

我不小心将其转换forceTouchCapability为 a BOOL(将其用作设置为返回布尔值的方法的返回值)。我需要检查是否forceTouchCapability等于UIForceTouchCapabilityAvailable

代替:

return [[MyView traitCollection] forceTouchCapability];

我需要:

return [[MyView traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable;
于 2015-09-28T02:10:13.597 回答
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");
    }
}
于 2016-01-12T03:26:34.510 回答
3

有时我们只想forceTouchCapability同步拥有价值,不想等待traitCollectionDidChange:事件。在这种情况下,我们可以像这样使用非常愚蠢的函数:

public func forceTouchCapability() -> UIForceTouchCapability {
    return UIApplication.sharedApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown
}
于 2016-06-14T21:04:23.663 回答
3
if ([MyView respondsToSelector:@selector(traitCollection)] &&
    [MyView.traitCollection respondsToSelector:@selector(forceTouchCapability)] &&
    MyView.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
        return YES;
    }

我的意思是,如果您同时支持iOS 7iOS 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 上崩溃之后,才学会了它。

于 2017-01-22T18:36:18.283 回答
0

斯威夫特 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
      }
    }
  }
于 2018-09-19T06:07:13.080 回答
0

跟随 Valentin Shergin,如果您需要同步调用,则更新为 swift 4.2:

func forceTouchCapability() -> UIForceTouchCapability {
    return UIApplication.shared.keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .unknown
}


func hasForceTouchCapability() -> Bool {
    return forceTouchCapability() == .available
}
于 2018-11-04T10:36:02.533 回答