http://unmi.cc/uiwebview-replace-uitextview-line-height
我们在使用 UILabel 或是 UITextView 时,如果文字出现了换行,目前我还不知道如何去控制行间距,固定的 Label 文字 可以折成两个 Label 上下显示,但是对应大段显示的段落要多行显示时该如何呢,多行单独控制就变得不现实了。
由于 UILabel 或 UITextView 并不提供对行间距 line-height 的设置,要达成所愿指定行间距的方法,我可以想到三种方式:
1. 自定义相应的控件,在控件内部方法中去做文章,未实践,可能是个好方法
2. 修改字体,由于默认行间距是由字体本身特性决定的,所以可以修改字体来满足有限的需求,不是很现实
3. 用 UIWebView 来代替 UITextView,这是本文的思想
先看个图片,看看在使用某些字体时失控的行间距是什么样的效果:
说明:上图左边是用 UITextView 来显示一段文字,由于行间距不可控,不是我们想要的。右边就是用 UIWebView 来显示的同一段文它,它的行间距我们可以随意控制。
思才过程是这样的,对于 UITextView 多行文字显示时行间距不能直接用代码来设置,特别是对于某些字体来说行间距确有些夸张。然后首先想到的解决方式是创建自己的 UITextView 子类,重新实现某些方法,似乎不那么容易。
进而也不能不研究,这默认的行间距内部是由什么控制着的,是字体,看用 FontCreator 打开的一个字体文件中的字符:
看字体的 WinAscent, WinDescent 在上下决定了字符上下间的距离了,所以你当然可以修改字体文件的属性了,存成新的字体文件,那如果一个应用中会有多种行间距的话那就痛苦了,且不说中文字体文件都不算小的。
再就是想到 Web 中的 CSS 对字体什么想怎么就怎么,所以想到用 UIWebView 来代替 UITextView,而且 iOS 下的 Safari 对 HTML5 也支持的不错,那就尝试吧,不过首先得解决下面几个问题:
1. 可以使用本地字体,因为自己的应用中可能会加入自定义的字体,不仅仅是用系统字体,HTML5 可以支持服务器端字体,用 @font-face
2. 像 UITextView 那样背景要能透明化,HTML5 支持 rgba 附加 Alpha 通道来指定颜色,且可设置 opacity, transparent 样式
下面贴下我的解决办法及步骤,如果在设置样式上还有新方法,可继续发掘。
第一步:引入自定义字体,一个 ttf 文件
把你的字体文件添加到项目中去,然后在项目的 Target 的 Info 标签页中,添加到 Fonts provided by application 属性中,如图:
在 Fonts provided by application 中添加一项 Item 0,并指定字体文件,可添加多个,每个字体文件的 Font-Family 名称你应要知道。
第二步:添加 UIWebView,并对 WebView 应用如下代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
|
webview.backgroundColor = [ UIColor clearColor];
webview.opaque = NO ;
webview.dataDetectorTypes = UIDataDetectorTypeNone ;
NSString *webviewText = @ "<style>body{margin:0;background-color:transparent;font:16px/18px Custom-Font-Name}</style>" ;
NSString *htmlString = [webviewText stringByAppendingFormat:@ "%@" , textview.text];
[webview loadHTMLString:htmlString baseURL: nil ];
|
执行之后显示的就是第一个图中的效果了。有可能出现在 iOS4 下背景未能透明化的问题,是可能,我有碰到过,也许哪里设置的问题。
注意,很重要的一点,上面 iOS4 下背景可能不透明的情况是因为:虽然可以在 xib 中对 UIWebView 设置它的 backgroundColor 为 clearColor,但是 Xcode 似乎不怎么认账,所以必须在代码中用 webview.backgroundColor = [UIColor clearColor]; 设置 UIWebView 的背景才成,opaque 在 xib 还是在代码中设置都行。
另外,也可以用 background-color: rgba(0,0,0,0) 样式,最后一个 0 表示 Alpha 值,即完全透明,甚至是用 background-color:hsla(120,50%,50%,0) 也是可行的。
对于 UIWebView 来说,你能够应用 HTML5 很多特性,所以不要求有很规范的 HTML 格式,像无需写成 <html><head>....... 那样。
尝试了用 @font-face 来使用自定义字体,未能成功,再就是对 UIWebView 的用户交互及滚动条风格调一调,可让它更像是个 UITextView,完全的代替 UITextView 来显示一段文字某些地方有可能仍需作微调。
分享到:
相关推荐
这不仅可以解决UIWebView的弃用问题,还能获取到Cocos2dx的最新特性和优化。 2. **手动替换UIWebView为WKWebView**:如果你无法或不想升级Cocos2dx,你可以选择手动替换。你需要找到Cocos2dx引擎中的`UIWebViewImpl...
UITextView 和UILable 它本身是没有控制行高的。很多人说用Uiwebview,但我觉得那不好用,要用html布局麻烦,占内存。也有人说drawatpoint,但 发现画中文的时候也很占内存,我就投机取巧一下吧
ITMS-90809: Deprecated API Usage - New apps that...Unity IOS审核被拒,解决办法,去网上看了好多帖子,据说2017版本之后没有问题,我用的是5.6版本的,不想升级版本,换了一个环境说不定问题更多。解决办法在附件。
3. **性能优化**: 使用`WKWebView`替代`UIWebView`,因为`WKWebView`在性能、电池寿命和安全性方面有更好的表现。 4. **自定义UI**: 可以通过设置`UIWebView`的代理方法来实现自定义的前进、后退按钮等UI元素。 这...
使用`WKWebView`(iOS 8.0及以后版本)代替UIWebView可以提供更好的安全性。 8. **内存管理**:UIWebView是一个内存消耗较大的组件,当不再使用时,应确保释放以避免内存泄漏。 通过研究“IOS UIWebView Demo”,...
为了解决这个问题,开发者可以利用本地数据来代替远程UIWebView请求,这样即使在网络不可用时也能提供内容。这个"iphone 利用本地数据来代替远程UIWebView请求实例"就是针对这一需求的解决方案。 首先,我们要理解...
在iOS应用开发中,UIWebView是一个非常重要的组件,它允许开发者在应用程序内嵌入网页内容,实现网页浏览功能。这个示例程序是针对iPhone平台,旨在帮助开发者理解如何有效地使用UIWebView来展示网页数据。通过这个...
- 安全性:避免在UIWebView中加载不受信任的第三方内容,因为这可能引发安全问题,如跨站脚本攻击(XSS)。 - 性能:UIWebView性能相对较差,特别是处理复杂的网页。现代项目推荐使用`WKWebView`,它有更好的性能和...
5. **处理错误**:UIWebView在加载过程中可能会遇到错误,如网络问题或无效的URL。你可以通过设置`UIWebViewDelegate`来监听这些错误,如`webView(_:didFailLoadWithError:)`方法。 6. **前进与后退**:UIWebView...
在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。这个话题“UIWebView+html+css”主要关注如何在UIWebView中嵌入HTML和CSS,实现可点击的链接以及显示动态的GIF动画效果。下面将详细讲解这个...
由于UIWebView存在性能和安全问题,苹果推荐使用WKWebView。WKWebView使用WebKit框架,提供更快的渲染速度和更好的内存管理,同时支持更多现代Web标准。 六、总结 UIWebView是iOS应用中用于展示网页内容的关键组件...
UIWebView是Objective-C时代的主要解决方案,虽然在Swift 3之后已经被WKWebView所取代,但仍然有很多遗留项目在使用它。 UIWebView主要涉及以下几个知识点: 1. **初始化UIWebView**: 在创建UIWebView时,你需要...
方法,通过调用参数request对象的URL属性来获取关于本次请求的地址以及参数信息,因此可以通过js代码模拟一次特殊的网络请求来达到调用该代理方法的作用,并通过过滤“特殊的url”来达到有目的性的js代码调用native...
为了解决这个问题,开发者通常会采用离线浏览的技术,使得用户可以在无网络条件下依然可以访问之前加载过的网页。本教程将详细讲解如何为UIWebView实现离线浏览功能。 【描述】: 这篇博客(原文链接:...
**正文** 在iOS开发中,UIWebView是苹果提供的一个关键组件,用于在应用程序内部展示网页内容。...在本文中,我们将深入探讨...尽管有新的替代品,但理解UIWebView的工作原理和使用方式对于iOS开发者来说仍然是必要的。
在iOS开发中,UIWebView是苹果提供的一种原生控件,用于展示网页内容。它可以加载HTML、CSS和JavaScript代码,并且具有与Objective-C(OC)代码进行交互的能力。本项目"UIWebView和js交互demo1"就是展示了如何利用...
UIWebView有一些代理方法可以监听加载状态,如`webViewDidStartLoad:`(开始加载)、`webViewDidFinishLoad:`(加载完成)和`webView:didFailLoadWithError:`(加载失败)。你可以通过设置`UIWebViewDelegate`来...
然而,有时候开发者需要对加载的资源进行一些特殊处理,比如在本文提到的案例中,由于JavaScript文件过大导致加载速度慢,开发者想要将JavaScript文件打包到应用本地,以加快加载速度。但是,UIWebView本身并不支持...
在iOS开发中,为了优化用户体验和减少网络流量,开发者经常需要缓存网络请求的数据,特别是对于UIWebView的加载内容。`NSURLCache`是苹果提供的一个关键类,它允许我们在本地存储HTTP和HTTPS请求的响应,以便在后续...