pyr*_*iku 10 iphone nsattributedstring ios swift
所以,我在一个项目中遇到问题,某些旧版iPhone在某些iOS版本中没有正确呈现某些字符串(特别是它不适用于带有iOS10的iPhone 5,而它适用于iOS9.3,奇怪的是).为了减少这个问题,我写了这段代码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var label: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Long HTML, although we'll make it even larger to prove a point
let string = "<h1>Thing 1</h1><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p><h1>Thing 2</h1><p>Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. </p><h1>Thing 3</h1><p>Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. </p><h1>Thing 4</h1><p>Sed lectus. Integer euismod lacus luctus magna. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. </p><h1>Thing 5</h1><p>Integer lacinia sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante. Nulla quam. Aenean laoreet. Vestibulum nisi lectus, commodo ac, facilisis ac, ultricies eu, pede. Ut orci risus, accumsan porttitor, cursus quis, aliquet eget, justo. Sed pretium blandit orci. </p><h1>Thing 6</h1><p>Ut eu diam at pede suscipit sodales. Aenean lectus elit, fermentum non, convallis id, sagittis at, neque. Nullam mauris orci, aliquet et, iaculis et, viverra vitae, ligula. Nulla ut felis in purus aliquam imperdiet. Maecenas aliquet mollis lectus. Vivamus consectetuer risus et tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. </p>"
let attrStr = try! NSAttributedString(
data: (string + string + string + string + string + string + string + string).data(using: String.Encoding.unicode,allowLossyConversion: true)!,
options: [ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType],
documentAttributes: nil)
label.attributedText = attrStr
label.backgroundColor = UIColor(red:0.00, green:1.00, blue:0.00, alpha:1.0)
}
}
Run Code Online (Sandbox Code Playgroud)
很简单.当然,真正的问题比这更复杂,但想法是一样的.
因此,在iPhone 7中,一切正常:
但是,在iPhone 4s上加载时:
调试时,attrStr
似乎在两种情况下都正确设置.
有任何想法吗?我的理论是老手机太慢而无法准时渲染,但我不太清楚如何解决这个问题.
谢谢!
编辑:对于那些问,这是故事板:
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="JzW-qG-LFG">
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11161"/>
<capability name="Constraints to layout margins" minToolsVersion="6.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="9PR-d2-hNU">
<objects>
<viewController id="JzW-qG-LFG" customClass="ViewController" customModule="things" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="VGp-YT-QQN"/>
<viewControllerLayoutGuide type="bottom" id="SeT-t7-CD0"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="gtg-CO-E9d">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Id1-A1-RaT">
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstAttribute="trailingMargin" secondItem="Id1-A1-RaT" secondAttribute="trailing" id="0qp-Rk-PC2"/>
<constraint firstItem="Id1-A1-RaT" firstAttribute="leading" secondItem="gtg-CO-E9d" secondAttribute="leadingMargin" id="3Vc-he-HqH"/>
<constraint firstItem="Id1-A1-RaT" firstAttribute="top" secondItem="VGp-YT-QQN" secondAttribute="bottom" id="7IE-fY-4H0"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="Opz-px-hsl"/>
<connections>
<outlet property="label" destination="Id1-A1-RaT" id="TNv-G9-ASE"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="qlV-6d-ISJ" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2848.8000000000002" y="-280.20989505247377"/>
</scene>
</scenes>
</document>
Run Code Online (Sandbox Code Playgroud)
rob*_*off 13
这里的问题是UIView
没有未记录的高度限制为8192点.一旦标签高8192点(或更高),它就不再更新帧缓冲区.(据推测,CALayer
一旦图层太大,窗口服务器就会忽略标签.)帧缓冲区中已存在的内容仍然存在.据推测,行为未定义,可能因iOS设备和版本而异.
(编辑:考虑到这一点,我怀疑限制是16,384像素,而不是8,192点.我不认为窗口服务器处理积分.)
为了演示,我使用了您的代码和故事板并添加了三件事:
以下是运行iOS 10.2的iPhone SE模拟器中发生的情况:
在演示中,您可以看到,一旦高度限制超过8192点,滑块的拇指开始看起来模糊,高度标签的文本明显覆盖自身.这是因为绿色标签不再更新帧缓冲区,因此之前的任何内容(由滑块和高度标签绘制)仍然存在,只会覆盖滑块和高度标签重绘的位置.一旦高度向下回到8192点的阈值,绿色标签再次自我吸收,清理混乱.
我认为你在iPhone 7测试中没有看到这一点,因为iPhone 7的屏幕比iPhone SE更宽.所有配备3.5英寸和4英寸屏幕的iPhone均为320点宽.4.7英寸屏幕的iPhone宽375分,5.5英寸屏幕的iPhone宽414分.
更宽的屏幕意味着更宽广UILabel
.这意味着更多文本适合每一行,因此标签不必高到适合所有文本.我怀疑在较大的屏幕上,你的标签短于8192点,因此它们不会出现未定义的行为.
解决方法:
如果您不打算让用户滚动查看整个文本,只需在标签上添加高度约束即可.
如果您想让用户滚动,请尝试使用UIWebView
或WKWebView
代替a UILabel
来显示文本.我相信这些观点可以处理超过8192点的内容.
顺便说一下,你不是第一个遇到这个问题的人:当高度大于8192时,UILabel视图会消失.但是,您的问题目前有一个公开的赏金,这可以防止它作为副本被关闭.
归档时间: |
|
查看次数: |
627 次 |
最近记录: |