Webview 在 iOS7 上被剪辑

问题描述 投票:0回答:4

enter image description here

enter image description here

我开发了一个阅读器,在使用 .css 添加水平分页后,它可以在 web 视图上显示 html 文件的内容。一切都工作正常,但在 iOS7 上我注意到 web 视图在左边缘被裁剪。

我尝试过以下方法:

readingWebView.frame = CGRectMake(0, 0, 768, 920);   
[readingWebView loadHTMLString:loadString baseURL:nil];
readingWebView.autoresizingMask = UIViewAutoresizingFlexibleHeight |        UIViewAutoresizingFlexibleWidth;
readingWebView.clipsToBounds = false;
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets = NO;

这是我的css文件:

html {
height:820px;
//margin:0px;
font-size:24px;
width:628px;
}

body {
margin:0px;
    padding:0px;
    width:628px;

}

#viewer {
    width:628px;
    height:820px;

}

#book {
width:628px;
height:820px;

margin-left:50px;
margin-right:50px;
//margin-top:100px;

-webkit-column-count:auto;
-webkit-column-width:668px;
-webkit-column-gap:140px;
text-align:justify;

 }

.h {
margin-top:8px;
 }
ios pagination ios7 uiwebview
4个回答
2
投票

我认为这是一个 CSS 问题。显然,webkit 有一些不同的文本剪切问题,只需在任何文本行末尾添加

 
即可解决。直接在一个单词被剪辑之后。

您可以尝试修改您的一个 html 文件,在字母被剪切后添加

 
并看看是否可以修复它吗?如果是这样,我们可以继续编写 javascript,在正确的位置自动插入
 


编辑:如果它确实有效,请使用以下 JavaScript 代码:

var bodyText = "هذا هو بلدي النص الأساسي.";
var newBodyText = bodyText.replace(" ","  ");

再想一想,由于你是一个 RTL 字符串,你可能需要使用它,不确定

string.replace
函数如何处理 RTL

var bodyText = "هذا هو بلدي النص الأساسي.";
var newBodyText = bodyText.replace(" ","  ");

编辑编辑:

通过 RegEx 来做到这一点(忽略 HTML <*>script 标签,在 Objective-C 中我相信你会使用这段代码(我对 RegEx 不太了解,所以如果它不起作用,我会用 RegEx 提出一个新问题)标记如何执行此操作,他们可能会在几分钟内给您答案!))。

NSString *string = originalHTMLString;

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?i)(<script(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</script\\s*>|<style(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</style\\s*>|<textarea(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</textarea\\s*>|</?[a-z](?:[^>\"']|\"[^\"]*\"]|'[^']*')*>|\\S+)|\\s+" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"&nbsp; "];

finalHTMLString = modifiedString;

...再次考虑一下,因为它是一种 RTL 语言,所以您实际上可以使用代码的这种变体,将 nbsp 放在空格后面(从左到右):

NSString *string = originalHTMLString;

NSError *error = nil;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?i)(<script(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</script\\s*>|<style(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</style\\s*>|<textarea(?:[^>\"']|\"[^\"]*\"]|'[^']*')*>)\s+</textarea\\s*>|</?[a-z](?:[^>\"']|\"[^\"]*\"]|'[^']*')*>|\\S+)|\\s+" options:NSRegularExpressionCaseInsensitive error:&error];
NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@" &nbsp;"];

finalHTMLString = modifiedString;

1
投票

我们还在项目中使用 UIWebView 来处理一些特殊内容,例如演示文稿和电子书,我建议您使用

viewport
来使内容不受限制。

很容易通过谷歌搜索详细信息,或者您可以在苹果开发中心查看文档配置视口


1
投票

我真的不知道问题是什么,但也许苹果在 webViewDelegate 中有一个默认启用裁剪的视图? ...你能试试这个吗:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSLog(@"Adjusting SubView Clippings");//<-- Wait until this logs otherwise this code hasn't been called yet, even if webView looks like it's been displayed!
    for (UIView *view in [webView subViews]) {
        view.clipsToBounds = NO;
    }
}

而且我也看不到你的整个项目文件,但看看这是否有效:

view.superview.clipsToBounds = NO;

另外,也许 UIWebView 解释 CSS

margin
标签的方式是罪魁祸首?您是否尝试过加载没有左右边距的页面,然后缩小 UIWebView 的宽度以在 Objective-C 中创建边距。这能解决问题吗? (当然,clipToBounds 必须保持 false,哈哈)


1
投票

这是 WebKit 中的一个已知错误。所有 RTL 语言中都会发生这种情况。对于我们的应用程序,当我们的元标记视口不够宽,无法捕获整个 RTL 元素时,就会发生这种情况。

如果您仅呈现格式化文本和可能的图像,我建议移至

UITextView

© www.soinside.com 2019 - 2024. All rights reserved.