【问题标题】:Check if 3D touch is supported and enabled on the iOS9 device检查 iOS9 设备是否支持并启用 3D 触摸
【发布时间】:2015-09-28 00:54:23
【问题描述】:

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

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

【问题讨论】:

  • 这是个坏消息 - 你在 9.1 测试版上试过了吗?
  • 不,我们将在几天后发布的应用程序中添加 3D 触摸功能,因此我们的目标是 9.0。使用 Xcode 7.0。
  • 也许我做错了什么。
  • 据我了解,您在访问特征集合和使用forceTouchCapability 方面处于正确的轨道上。此链接似乎有用/相关:pinkstone.co.uk/…
  • 你凭什么说forceTouchCapability 只检查设备是否为iOS 9 或更高版本?

标签: ios iphone 3dtouch


【解决方案1】:

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

代替:

return [[MyView traitCollection] forceTouchCapability];

我需要:

return [[MyView traitCollection] forceTouchCapability] == UIForceTouchCapabilityAvailable;

【讨论】:

  • 请记住,如果您的应用除了支持 iOS 9 之外还支持 iOS 8.x 或更早版本,则需要妥善保护此代码。
  • 是的!谢谢,已经完成了:) 已经正确地碰到了,呵呵。
  • @Prodigga 嘿,我没有 3D 触摸设备我想问:虽然它为不支持 3D 触摸的设备返回 NotAvailable,但它是否也为具有 3D 触摸但在设置中禁用的设备返回 NotAvailable?
【解决方案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");
    }
}

【讨论】:

  • 谢谢——这是我的问题!
  • it 3d touch 从设置中禁用,如何检查
  • @Shohrab 这个方法会自动检测到这个。
【解决方案3】:

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

public func forceTouchCapability() -> UIForceTouchCapability {
    return UIApplication.sharedApplication().keyWindow?.rootViewController?.traitCollection.forceTouchCapability ?? .Unknown
}

【讨论】:

    【解决方案4】:
    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 上崩溃。 基本上,Apple 在 iOS 8 中引入了traitCollection 属性,但仅在 iOS 9 中添加了forceTouchCapability 属性。

    来自 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 上崩溃后,才学会了这一点。

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-11-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          • 1970-01-01
          相关资源
          最近更新 更多