Вот упрощенная версия моей настройки. Сообщите мне, будет ли полезно включить больше моего решения.
Код: Выделить всё
let text:String
let mentions: [String: String]
let lineLimit:Int?
@State private var height: CGFloat = .zero
var body: some View {
ActiveLabelWrapper(
text: text,
lineLimit: lineLimit,
height: $height,
handleHashtagTap: {hashtag in print(hashtag)},
handleMentionTap: {username in print(username)}
).frame(minHeight: height)
}
Код: Выделить всё
enter cstruct ActiveLabelWrapper: UIViewRepresentable {
let text: String
let lineLimit: Int?
@Binding var height: CGFloat
let handleHashtagTap: (String) -> Void
let handleMentionTap: (String) -> Void
func makeUIView(context: Context) -> ActiveLabel {
let label = ActiveLabel()
label.enabledTypes = [.mention, .hashtag]
label.text = text
...
label.numberOfLines = lineLimit ?? 0
label.adjustsFontSizeToFitWidth = false
label.lineBreakMode = .byTruncatingTail
label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
label.setContentCompressionResistancePriority(.defaultLow, for: .vertical)
label.setContentHuggingPriority(.defaultHigh, for: .horizontal)
return label
}
func updateUIView(_ uiView: ActiveLabel, context: Context) {
uiView.text = text
DispatchQueue.main.async {
height = uiView.sizeThatFits(CGSize(width: uiView.bounds.width, height: CGFloat.greatestFiniteMagnitude)).height
}
}
Для большего контекста, причина, по которой я считаю, что проблема заключается в том, что высота кадра не обновляется, заключается в том, что Я подтвердил, что ui.sizeThatFits(...) возвращает правильное значение. И даже если я вручную обновлю размер с помощью .onAppear() или .task(), высота кадра никогда не изменится.
Что мне не хватает? Я много пробовал, но ничего не помогло, поэтому буду рад любой помощи.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ctivelabel
Мобильная версия