WKWebView 在旧项目中显示内容错误的框架
Posted
技术标签:
【中文标题】WKWebView 在旧项目中显示内容错误的框架【英文标题】:WKWebView show content wrong frame in old project 【发布时间】:2021-06-10 10:17:27 【问题描述】:我有一个使用 Objective C 的旧 ios 项目。当我将 WKWebView 添加到 ViewController 时
NSURL *url = [NSURL URLWithString:@"https://www.google.com"];
WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:theConfiguration];
[self.view addSubview:_webView];
self.webView.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[
[self.webView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
[self.webView.leftAnchor constraintEqualToAnchor:self.view.leftAnchor],
[self.webView.rightAnchor constraintEqualToAnchor:self.view.rightAnchor],
[self.webView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor]
]];
[_webView loadRequest:[NSURLRequest requestWithURL:url]];
如果我在 iOS 14 中通过 Xcode 安装应用程序,webview 工作正常,但在我断开 Xcode 并直接打开应用程序后,webview 显示内容的框架错误。如果我通过 Xcode 在 iOS 12.5 中构建应用程序,Web 视图也会显示错误框架的内容。 如果我从 Xcode 12.5 创建新项目并使用相同的代码,它工作正常。
这是通过 Xcode 构建打开应用时的屏幕截图
https://i.stack.imgur.com/rYb3M.png
这是直接打开应用时的截图:
https://i.stack.imgur.com/4q0uD.png
【问题讨论】:
【参考方案1】:一些观察 -
此代码混合使用了_webView
和self.webView
。为清楚起见,您应该至少统一这个代码块的用法。
你到底在哪里称呼这部分? viewDidLoad()
或在某些事件之后?添加后可以尝试添加layoutIfNeeded()
调用吗?
/// After activating constraints
[self.view layoutIfNeeded];
-
您应该尝试分别使用
leadingAnchor
和trailingAnchor
而不是leftAnchor
和rightAnchor
。
如果没有任何帮助,我认为您的视图控制器的视图情节提要设置未更新为使用自动布局。在这种情况下,你可以试试这个 -
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:theConfiguration];
_webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
[self.view addSubview:_webView];
请注意,在这种情况下 - 您必须删除所有与约束相关的代码。
/*
self.webView.translatesAutoresizingMaskIntoConstraints = NO;
[NSLayoutConstraint activateConstraints:@[ ...... ]];
*/
【讨论】:
-'ViewController' 没有可见的@interface 声明选择器'requiresConstraintBasedLayout' 但是如果我不使用自动布局,而只使用框架,它仍然是同样的问题。 为了测试,我在viewDidApear中写了这段代码,layoutIfNeeded也没用 哦,对不起,当我使用 self.view 时,它显示同样的错误。 “UIView”没有可见的@interface 声明选择器“requiresConstraintBasedLayout” 在“UIView *”类型的对象上找不到属性“requiresConstraintBasedLayout” webview 框架仍然是真的,即使里面的滚动视图和 WKWebViewContent 框架仍然是真的,但是下一级子视图是错误的框架【参考方案2】:经过几天的搜索,我终于找到了错误的原因。 在 UIView 扩展文件中重写 center 属性
#import <UIKit/UIKit.h>
@interface UIView (FrameExtension)
@property CGPoint center;
@end
.
#import "UIView+FrameExtension.h"
@implementation UIView (FrameExtension)
- (CGPoint)center
return CGPointMake(self.frame.origin.x + self.frame.size.width / 2,
self.frame.origin.y + self.frame.size.height / 2);
- (void)setCenter:(CGPoint)center
CGRect frame = self.frame;
frame.origin = CGPointMake(center.x - self.frame.size.width / 2,
center.y - self.frame.size.height / 2);
self.frame = frame;
@end
不知何故,在加载 webview 时,它调用了导致错误的 setCenter。
【讨论】:
以上是关于WKWebView 在旧项目中显示内容错误的框架的主要内容,如果未能解决你的问题,请参考以下文章