Высота кадра SwiftUI не обновляется с помощью ActiveLabelIOS

Программируем под IOS
Ответить
Anonymous
 Высота кадра SwiftUI не обновляется с помощью ActiveLabel

Сообщение Anonymous »

У меня есть представление SwiftUI, использующее UIViewRepresentable для отображения ActiveLabel. У меня есть модификатор .frame() для этой ActiveLabel, высота которого отражается переменной @State. Когда эта высота обновляется, высота кадра не всегда обновляется. Делаю ли я что-то явно неправильно?
Вот упрощенная версия моей настройки. Сообщите мне, будет ли полезно включить больше моего решения.

Код: Выделить всё

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)
}
Вот ActiveLabelWrapper:

Код: Выделить всё

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
}
}
Похоже, что этот код работает большую часть времени при использовании симулятора iOS (не всегда), но когда я открываю приложение на своем физическом устройстве, высота не обновляется после появления текста ActiveLabel. создается, вместо этого отображается только одна строка текста, а не все строки.
Для большего контекста, причина, по которой я считаю, что проблема заключается в том, что высота кадра не обновляется, заключается в том, что Я подтвердил, что ui.sizeThatFits(...) возвращает правильное значение. И даже если я вручную обновлю размер с помощью .onAppear() или .task(), высота кадра никогда не изменится.
Что мне не хватает? Я много пробовал, но ничего не помогло, поэтому буду рад любой помощи.

Подробнее здесь: https://stackoverflow.com/questions/786 ... ctivelabel
Ответить

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

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

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

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

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