我开发了一个阅读器,在使用 .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;
}
我认为这是一个 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:@" "];
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:@" "];
finalHTMLString = modifiedString;
我们还在项目中使用 UIWebView 来处理一些特殊内容,例如演示文稿和电子书,我建议您使用
viewport
来使内容不受限制。
很容易通过谷歌搜索详细信息,或者您可以在苹果开发中心查看文档配置视口
我真的不知道问题是什么,但也许苹果在 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,哈哈)
这是 WebKit 中的一个已知错误。所有 RTL 语言中都会发生这种情况。对于我们的应用程序,当我们的元标记视口不够宽,无法捕获整个 RTL 元素时,就会发生这种情况。
如果您仅呈现格式化文本和可能的图像,我建议移至
UITextView
。