Пример проекта: http://d.pr/f/1coXu
Я использую TextKit для рендеринга текста в то, что по сути является очень простым воссозданием UILabel
. Код очень прост и в этом примере просто рисует NSAttributedString
в самом представлении:
class TextKitView: UIView {
// TextKit Objects
var textStorage: NSTextStorage!
var textContainer: NSTextContainer!
var layoutManager: NSLayoutManager!
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.clearColor()
layoutManager = NSLayoutManager()
textStorage = NSTextStorage(attributedString: createAttributedString())
textStorage.addLayoutManager(layoutManager)
textContainer = NSTextContainer(size: CGSize(width: bounds.width, height: bounds.height))
layoutManager.addTextContainer(textContainer)
}
required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) has not been implemented") }
override func drawRect(rect: CGRect) {
let glyphRange = layoutManager.glyphRangeForTextContainer(textContainer)
layoutManager.drawBackgroundForGlyphRange(glyphRange, atPoint: bounds.origin)
layoutManager.drawGlyphsForGlyphRange(glyphRange, atPoint: bounds.origin)
}
private func createAttributedString() -> NSAttributedString {
let attributedString = NSMutableAttributedString(string: "Test string for testing", attributes: [NSForegroundColorAttributeName: UIColor.blackColor(), NSFontAttributeName: UIFont.systemFontOfSize(16.0)])
let labelAttributedString = NSAttributedString(string: "Foo bar\n testing", attributes: [NSForegroundColorAttributeName: UIColor.darkGrayColor(), NSBackgroundColorAttributeName: UIColor(white: 0.95, alpha: 1.0)])
attributedString.appendAttributedString(labelAttributedString)
return attributedString
}
}
Однако, когда я создаю представление:
override func viewDidLoad() {
super.viewDidLoad()
let textKitView = TextKitView(frame: CGRect(x: 0.0, y: 100.0, width: 320.0, height: 320.0))
view.addSubview(textKitView)
}
В итоге это выглядит так:
Где вы можете видеть, что по какой-то необъяснимой причине цвет фона и высота второй строки значительно короче, чем у первой, что выглядит очень странно.
Как предотвратить это? Что вызывает это? Если я использую UILabel
и предоставляю одну и ту же атрибутированную строку, обе строки имеют одинаковую высоту. Я прикрепил очень минимальный пример проекта выше, если это поможет.