我有这样的设置:
self.webView = WKWebView(frame: frame, configuration: WKWebViewConfiguration())
self.externView = UIView(frame: frame)
self.externWebView = WKWebView(frame: subFrame, configuration: WKWebViewConfiguration())
let StackView = UIStackView(frame: frame)
self.externView?.addSubview(StackView)
self.externView?.backgroundColor = UIColor.blackColor()
view.addSubview(self.webView!)
self.externView?.hidden = true
StackView.addSubview(self.externWebView!)
view.addSubview(self.externView!)
这创建了我想要的初始设置,这允许 1 个 Web View 充当主要 View ,它可以启动和外部 View 来呈现最初隐藏的其他内容。
我遇到的问题是,我正在调用一个工作线程
WKExteralLoader.externView!.hidden = false;
WKExteralLoader.webView!.hidden = true;
最多可能需要 30 秒才能生效;然而,它的反转几乎是瞬时的。
WKExteralLoader.webView!.hidden = false;
WKExteralLoader.externView!.hidden = true;
有什么想法会导致这个问题吗?
谢谢!
最佳答案
@MobileMon 告诉您如何解决问题,但没有说明原因。
UIKit 不是线程安全的,这意味着必须从主线程进行所有 UIKit 调用。设置 View 的隐藏标志是一个 UIKit 调用,因此需要从主线程完成。
如果您从后台线程操作 UIView 对象,结果是未定义的。大多数情况下结果是更改需要很长时间才能生效(你所看到的),但有时更改根本不会发生,有时结果是奇异的视觉效果,有时你的应用程序会碰撞。
无论何时从后台线程操作 UIView 对象,都需要将其包装在对 dispatch_async(dispatch_get_main_queue())
的调用中,如 MobileMon 的回答(或其他一些导致代码从主线程运行,但这是首选方式。)
编辑:
为了清楚起见,您说:
The problem I'm running into, is that from a worker thread I'm calling
WKExteralLoader.externView!.hidden = false; WKExteralLoader.webView!.hidden = true;
您不能从工作线程执行 UI 代码。相反,您需要像这样编写代码:
dispatch_async(dispatch_get_main_queue(), ^{
WKExteralLoader.externView!.hidden = false;
WKExteralLoader.webView!.hidden = true;
});
这样,您就可以从工作线程将 UI 代码分派(dispatch)回主线程。
您可能有其他代码试图在您不知情的情况下从后台线程执行 UIKit 调用。要检查,请添加以下行:
print("isMainThread = \(Thread.current.isMainThread)")
然后检查控制台中打印的内容。
关于ios - 显示隐藏 View 真的很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38057233/