如何通过代码在UITableView中添加WKWebView并避免分隔线重叠
解决WKWebView与UITableView分隔线重叠的问题
我明白你的问题了——你在TableViewController里嵌入WKWebView处理OAuth 2.0授权,但tableView的分隔线居然跑到WebView上方了,这确实影响体验。问题根源在于你把WebView添加到了tableView的子视图层级中,而tableView的分隔线是直接绘制在自身layer上的,层级优先级比你添加的WebView更高,所以会“透”出来。
这里给你两种可靠的解决思路:
方案一:将WebView添加到ViewController的主View上(推荐)
不要把WebView嵌套在tableView里,而是直接加到控制器的主View上,让它铺满整个屏幕,这样就能完全挡住tableView的所有内容(包括分隔线)。
修改你的代码如下:
override func viewDidLoad() { super.viewDidLoad() let webConfiguration = WKWebViewConfiguration() webView = WKWebView(frame: .zero, configuration: webConfiguration) webView.uiDelegate = self // 关闭自动布局转换,用AutoLayout约束更适配 webView.translatesAutoresizingMaskIntoConstraints = false // 添加到主View,而非tableView self.view.addSubview(webView) // 用AutoLayout让WebView铺满整个屏幕 NSLayoutConstraint.activate([ webView.topAnchor.constraint(equalTo: self.view.topAnchor), webView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor), webView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor), webView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor) ]) // 确保WebView在最上层,挡住tableView self.view.bringSubviewToFront(webView) let myRequest = URLRequest(url: URL(string: "https://www.google.ru/")!) webView.load(myRequest) }
当授权完成(比如成功获取到token后),记得移除或隐藏WebView,让tableView重新显示:
// 移除WebView webView.removeFromSuperview() // 或者只是隐藏(如果之后还要复用的话) // webView.isHidden = true
方案二:临时隐藏tableView的分隔线
如果暂时不想调整视图层级,也可以在显示WebView的时候临时隐藏tableView的分隔线,授权完成后再恢复:
// 显示WebView时隐藏分隔线 tableView.separatorStyle = .none // 授权完成后恢复分隔线 tableView.separatorStyle = .singleLine
不过这个方案只是“治标”,如果WebView没有完全铺满tableView,还是会有视觉问题,所以更推荐方案一。
内容的提问来源于stack exchange,提问作者flowGlen
相关产品推荐
相关产品推荐

