Как установить границы Uiview до того же размера, что и nstextlayoutfragment.layoutfragmentFrameIOS

Программируем под IOS
Ответить
Anonymous
 Как установить границы Uiview до того же размера, что и nstextlayoutfragment.layoutfragmentFrame

Сообщение Anonymous »

Я пытаюсь разработать свой собственный uiview , который использует TextKit2 для контроля над текстовым рендерингом для применения пользовательского рисунка. renderingSurfacebounds Внутри подкласса NSTextLayoutFragment , чтобы получить точные границы для текста - но я не смог соответственно изменить размер представления. src = "https://i.sstatic.net/zolitzk5.png"/>
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
}
}

}
и мой подкласс nstextlayoutfragment выглядит так (на данный момент он просто отображает зеленый прямоугольник позади текста, но он будет иметь гораздо более пользовательский рисунок позже):
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»