gpt4 book ai didi

ios - forceTouchCapability 返回零

转载 作者:技术小花猫 更新时间:2023-10-29 10:58:21 24 4
gpt4 key购买 nike

我正在尝试将一些 3D 触摸整合到应用程序中,但我遇到了一个奇怪的问题,即 forceTouchCapability支票正在返回 nilviewDidLoad但不在viewWillAppear/viewDidAppear .

我知道这仅适用于 iOS 9+,因此我添加了检查以验证 traitCollection View Controller 上的属性响应 forceTouchCapability如下所示:

- (void)loadView {

self.view = [[MyView alloc] init];
}

- (void)viewDidLoad {

[super viewDidLoad];

// Checking the force touch availability here
if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)] &&
self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {

// This won't get called because forceTouchCapability is returning nil
// which corresponds to UIForceTouchCapabilityUnknown
[self registerForPreviewingWithDelegate:self sourceView:self.view];
}
}

在 LLDB 中,在 if 处有一个断点语句,输入 po [self.traitCollection forceTouchCapability]返回 nil对应于 UIForceTouchCapabilityUnknown .然而,traitCollection本身不是nil .

根据 UIForceTouchCapabilityUnknown 的文档:

UIForceTouchCapabilityUnknown: The availability of 3D Touch is unknown. For example, if you create a view but have not yet added it to your app’s view hierarchy, the view’s trait collection has this value.

此时 View 是否已添加到层次结构中?

我很好奇之前是否有人遇到过这个问题以及如何解决这个问题?我想避免在 viewDidAppear 中添加它因为这可能会被调用很多。

如果有帮助,我正在 iOS 9.1 和 Xcode 7.2 的 6S 上运行它

最佳答案

该 View 尚未添加到 View 层次结构中。通过在调试控制台中检查 super View ,您可以很容易地看到这一点

(lldb) po self.view.superview
nil

如果这是您所看到的,则该 View 尚未添加到层次结构中:因此您必须将检查放在别处。

这有点令人困惑,因为在 Apple 的 ViewControllerPreview 示例应用程序中,它位于 viewDidLoad 中。但它确实应该在 traitCollectionDidChange: 中,因为这样您就可以确定该 View 已添加到应用程序的层次结构中。

这是我使用的代码(适用于 iOS 8,如果您不需要支持,请随意移动外部条件)。

- (void)traitCollectionDidChange:(UITraitCollection *)previousTraitCollection {
[super traitCollectionDidChange:previousTraitCollection];

if ([self.traitCollection respondsToSelector:@selector(forceTouchCapability)]) {
if (self.traitCollection.forceTouchCapability == UIForceTouchCapabilityAvailable) {
// retain the context to avoid registering more than once
if (!self.previewingContext) {
self.previewingContext = [self registerForPreviewingWithDelegate:self sourceView:self.view];
}
} else {
[self unregisterForPreviewingWithContext:self.previewingContext];
self.previewingContext = nil;
}
}
}

这样做的额外好处是,如果用户在应用程序运行时更改其 3D Touch 设置,您的 View 将被注册/取消注册。

关于ios - forceTouchCapability 返回零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34318283/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com