my uiview реализация выглядит так:
Код: Выделить всё
import UIKit
final class TextKit2UIView: UIView, NSTextLayoutManagerDelegate {
let contentStorage = NSTextContentStorage()
let layoutManager = NSTextLayoutManager()
let textContainer = NSTextContainer(size: .zero)
override init(frame: CGRect) {
super.init(frame: frame)
contentStorage.addTextLayoutManager(layoutManager)
layoutManager.textContainer = textContainer
layoutManager.delegate = self
backgroundColor = .brown.withAlphaComponent(0.2)
textContainer.lineFragmentPadding = 0
textContainer.lineBreakMode = .byTruncatingTail
contentStorage.attributedString = NSAttributedString(
string: "Integer bibendum luctus metus, vel mattis diam consequat non. Phasellus magna augue, faucibus et ullamcorper sit amet, vehicula quis nunc. Phasellus nisl arcu, tempus id metus ac, tempus mollis nisi. Duis in ultrices lectus.",
attributes: [.font: UIFont.systemFont(ofSize: 18)]
)
}
required init?(coder: NSCoder) { nil }
// using my own custom NSTextLayoutFragment
func textLayoutManager(_ textLayoutManager: NSTextLayoutManager,
textLayoutFragmentFor location: NSTextLocation,
in textElement: NSTextElement) -> NSTextLayoutFragment {
CustomLayoutFragment(textElement: textElement, range: textElement.elementRange)
}
override func layoutSubviews() {
super.layoutSubviews()
textContainer.size = bounds.size
layoutManager.ensureLayout(for: contentStorage.documentRange)
setNeedsDisplay()
}
override func draw(_ rect: CGRect) {
guard let ctx = UIGraphicsGetCurrentContext() else { return }
layoutManager.enumerateTextLayoutFragments(from: nil, options: []) { fragment in
fragment.draw(at: fragment.layoutFragmentFrame.origin, in: ctx)
return true
}
}
}
class CustomLayoutFragment: NSTextLayoutFragment {
override func draw(at renderingOrigin: CGPoint, in ctx: CGContext) {
let completeRect = self.layoutFragmentFrame
let shapeRect = Rectangle().path(in: completeRect).cgPath
ctx.saveGState()
ctx.addPath(shapeRect)
ctx.setFillColor(UIColor.green.withAlphaComponent(0.2).cgColor)
ctx.fillPath()
ctx.restoreGState()
super.draw(at: renderingOrigin, in: ctx)
}
}
< /code>
может кто -нибудь объяснить, как достичь желаемого поведения? В частности, как я могу убедиться, что кадр Uiview соответствует рамке текста, исключая видимый коричневый фон, который показывает скриншот? Uiview (и, следовательно, коричневый прямоугольник) имеет ширину и высоту, обеспечиваемые модификатором кадра Swiftui.
Подробнее здесь: https://stackoverflow.com/questions/797 ... layoutfrag
Мобильная версия