我正在创建一个要在我的iOS应用中导出的图片。我正在使用UIGraphicsBeginImageContext来绘制图像的元素,但我一直在努力在图像中绘制UITextView。
首先,我创建一个父视图进行渲染:
var parentView : UIView = UIView(frame: CGRectMake(0, 0, 700, 700))
然后我以编程方式创建textView并添加所有属性。我给它x = 100和y = 100来对齐图像中的文本。宽度= 500是好的,每边的边距为100px:
var textView: UITextView = UITextView(frame: CGRectMake(100, 100, 500, 350))
textView.text = myText
textView.textContainerInset = UIEdgeInsetsMake(20, 20, 20, 20)
textView.backgroundColor = UIColor(red: 255, green: 255, blue: 255, alpha: 0.70)
textView.font = UIFont(name: "Helvetica Neue Light Italic", size: 35)
然后我通过将它作为子视图添加到父视图中来渲染textview,然后我得到要导出的图像:
parentView.addSubview(textView)
parentView.layer.renderInContext(UIGraphicsGetCurrentContext())
var newIMG = UIGraphicsGetImageFromCurrentImageContext()
问题是高度固定为350px,但有时文本不够长,无法使用所有区域。理想情况下,我想知道我的文本将使用多少行,所以我可以给它一个比例高度,而不是一个白色的未使用区域(例如参见图片):
答案 0 :(得分:13)
我在Apple的Text Layout Programming Guide找到了解决这个问题的完美解决方案。 Apple提供的解决方案是Objective-C,因此我测试并重新编写了Swift。
这两种方法都很有效,并返回在UITextView中使用的完全行数,没有时髦的数学运算,每次都100%准确。
以下是我对UITextView的扩展,以添加numberOfLines()
方法:
extension UITextView {
func numberOfLines() -> Int {
let layoutManager = self.layoutManager
let numberOfGlyphs = layoutManager.numberOfGlyphs
var lineRange: NSRange = NSMakeRange(0, 1)
var index = 0
var numberOfLines = 0
while index < numberOfGlyphs {
layoutManager.lineFragmentRectForGlyphAtIndex(
index, effectiveRange: &lineRange
)
index = NSMaxRange(lineRange)
numberOfLines += 1
}
return numberOfLines
}
}
直接在您的UITextView上调用它,如下所示:myTextView.numberOfLines()
&lt; - 返回Int
此扩展名也可以轻松转换为如下方法:
func numberOfLines(textView: UITextView) -> Int {
let layoutManager = textView.layoutManager
let numberOfGlyphs = layoutManager.numberOfGlyphs
var lineRange: NSRange = NSMakeRange(0, 1)
var index = 0
var numberOfLines = 0
while index < numberOfGlyphs {
layoutManager.lineFragmentRectForGlyphAtIndex(index, effectiveRange: &lineRange)
index = NSMaxRange(lineRange)
numberOfLines += 1
}
return numberOfLines
}
只需调用numberOfLines(myTextView)
即可检索行数
答案 1 :(得分:1)
我没有找到获取行数的方法,但我设法使用textView.sizeToFit()删除了所有空格。它工作得很好,希望有人会觉得这很有用!