JSA*_*986 27 objective-c uiwebview ios ios8
在iOS 8中,当将.PDF渲染UIWebview为一个黑色边框时,显示PDF周围的背景(而不是整个背景视图).请注意,这不是UIWebview背景,它设置为:
myWebView.opaque = NO;
myWebView.backgroundColor = [UIColor clearColor];
Run Code Online (Sandbox Code Playgroud)
这在<iOS8中不存在,(.PDF周围没有黑色边框的彩色背景)
有没有其他人经历过这个可以解释一下这个问题?
我正在将我的PDF加载到Web视图中.
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
if (self.pdfData != nil && self.viewHasUnloaded == YES) {
self.viewHasUnloaded = NO;
[self.webView loadData:self.pdfData MIMEType:@"application/pdf" textEncodingName:@"utf-8" baseURL:nil];
}
}
Run Code Online (Sandbox Code Playgroud)
gra*_*ver 35
经过一番调查后,我设法了解了问题所在.所以,UIWebView是的UIView,有一个UIScrollView(与私人类_UIWebViewScrollView)为子视图.将PDF加载到UIWebView以下流程中:
1) UIWebView开始加载请求.此时-webViewDidStartLoad:调用委托方法.
2)加载PDF后,-webViewDidFinishLoad:调用委托方法.到那时,UIWebView知道这是一个PDF文件,并且UIWebPDFView已经插入了具有私有类的子视图_UIWebViewScrollView,但是PDF本身尚未呈现.
这就是问题所在.
3) PDF在屏幕外呈现,在准备好后,UIPDFPageView将插入一个带有私有类的新子视图,UIWebPDFView并显示PDF.问题是当这个插入发生时,UIWebPDFView它被backgroundColor设置为黑色并且这个插入在-webViewDidFinishLoad:被调用之后发生(时间取决于PDF的渲染大小).这就是为什么通过所有子视图并将其属性设置为白色不是一个好的解决方案,例如.
好消息是,当插入到视图层次结构中时,会调用该方法.所以,最终解决方案是将这个Objective-C代码放入我们的视图控制器:UIWebViewbackgroundColorUIViewController-viewDidLayoutSubviewsUIPDFPageViewUIWebView
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
// Assuming self.webView is our UIWebView
// We go though all sub views of the UIWebView and set their backgroundColor to white
UIView *v = self.webView;
while (v) {
v.backgroundColor = [UIColor whiteColor];
v = [v.subviews firstObject];
}
}
Run Code Online (Sandbox Code Playgroud)
在斯威夫特:
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
var v:UIView? = self.webView
while (v != nil) {
v!.backgroundColor = UIColor.whiteColor()
v = v!.subviews.first
}
}
Run Code Online (Sandbox Code Playgroud)
rai*_*ade 19
关闭WebKitDiskImageCacheEnabled,黑色边框消失:
在applicationDidFinishLaunchingWithOptions中添加以下行:
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"WebKitDiskImageCacheEnabled"];
[[NSUserDefaults standardUserDefaults] synchronize];
Run Code Online (Sandbox Code Playgroud)
我认为它有点像计时 - 因为UIWebPDFView在渲染完成之前被添加为子视图并且viewDidLayoutSubviews在发生之前被调用.并且因为没有像didFinshedRendering这样的事件我使用计时器来检查何时UIWebPDFView添加.
以下是为我工作.
将实例变量放在头文件或类中:
// instance variable for interval timer
NSTimer *BackgroundIntervalTimer;
Run Code Online (Sandbox Code Playgroud)
将这些方法放在实现文件中:
- (void)startUIWebViewBackgroundFixTimer {
// if > iOS 8 start fixing background color of UIWebPDFView
if (!SYSTEM_VERSION_LESS_THAN(@"8.0")) {
// hide pdfWebView until background fixed
self.pdfWebView.alpha = 0.0;
// start interval timer
BackgroundIntervalTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(fixBackground) userInfo:nil repeats:YES];
}
}
- (void)stopUIWebViewBackgroundFixTimer {
[BackgroundIntervalTimer invalidate];
BackgroundIntervalTimer = nil;
}
- (void)fixBackground {
// stop timer interval
[self stopUIWebViewBackgroundFixTimer];
// Assuming self.webView is our UIWebView
// We go though all sub views of the UIWebView and set their backgroundColor to white
UIView *v = self.pdfWebView;
while (v) {
//v.backgroundColor = [UIColor whiteColor];
v = [v.subviews firstObject];
if ([NSStringFromClass([v class]) isEqualToString:@"UIWebPDFView"]) {
[v setBackgroundColor:[UIColor whiteColor]];
// background set to white so fade view in and exit
[UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveEaseOut
animations:^{
self.pdfWebView.alpha = 1.0;
}
completion:nil];
return;
}
}
// UIWebPDFView doesnt exist yet so exit and try later
[self startUIWebViewBackgroundFixTimer];
}
Run Code Online (Sandbox Code Playgroud)
现在将此行放在加载pdf的行之后:
// if iOS 8 check if pdfWebView got subview of class UIWebPDFView
[self startUIWebViewBackgroundFixTimer];
Run Code Online (Sandbox Code Playgroud)
提示:
SYSTEM_VERSION_LESS_THAN 是一个宏,以确保代码只在iOS 8及更高版本上执行.self.pdfWebView 是你的UIWebView.解决方案在这里:
编辑(链接破碎)
如何从iOS 8中的PDF/UIWebView中删除黑色边框
它对我有用.
诀窍是在webView完成加载后更改背景颜色.
编辑
在iOS 8.0中,如果您在UIWebView中加载PDF页面,那么您将获得页面周围的黑色边框.
将PDF加载到webview时,它会将UIWebPDFView插入到webview中.
当呈现PDF时,它将新的私有类UIPDFPageView添加到具有黑色背景颜色的UIWebPDFView中.所有插入都发生在调用-webViewDidFinishLoad:方法之后.因此,您需要在-webViewDidFinishLoad:方法之后设置清晰或白色背景颜色集
添加以下方法以删除黑色边框颜色
在-webViewDidFinishLoad中调用该函数:
Run Code Online (Sandbox Code Playgroud)if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) { [self performSelector:@selector(clearBackground) withObject:nil afterDelay:0.1]; }.
Run Code Online (Sandbox Code Playgroud)- (void)clearBackground { UIView *v = webVw; while (v) { //v.backgroundColor = [UIColor whiteColor]; v = [v.subviews firstObject]; if ([NSStringFromClass([v class]) isEqualToString:@"UIWebPDFView"]) { [v setBackgroundColor:[UIColor whiteColor]]; // background set to white so fade view in and exit [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{ webVw.alpha = 1.0; } completion:nil]; return; } } }
| 归档时间: |
|
| 查看次数: |
10519 次 |
| 最近记录: |