- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
我正在尝试将一些 3D 触摸整合到应用程序中,但我遇到了一个奇怪的问题,即 forceTouchCapability
支票正在返回 nil
在 viewDidLoad
但不在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/
我正在尝试将一些 3D 触摸整合到应用程序中,但我遇到了一个奇怪的问题,即 forceTouchCapability支票正在返回 nil在 viewDidLoad但不在viewWillAppear/v
我是一名优秀的程序员,十分优秀!