У меня есть список задач, который отображает строки текста. Я реализовал drag n 'drop, чтобы строки можно было перерисовывать. Я использую GeometryReader для отслеживания текстовых фреймов, поэтому я знаю, куда я сбрасываю вещи и как переупорядочивать.
Проблема в том, что после того, как я переупорядочил один раз, я не могу переупорядочить снова правильно потому что кадры не обновляются.
Похоже на "geo" из GeometryReader, не обновляется каждый раз, когда текстовое поле перемещается. Он обновляется только в первый раз.
Text("Hello world")
.overlay(
GeometryReader { geo in
Color.clear
.onReceive(self.didSave) { _ in
// Problem: geo never updates, even if Text has moved.
self.textFrame[index] = geo.frame(in: .global)
}
}
)
Есть ли способ обновить "гео" при перемещении элемента, на который он накладывается?
** Редактировать:
Так что я решил исправить это по-другому. Обновление отлично работает на Appar of Geometry Reader. Поэтому в onRecieve я установил логическое имя refreshGeometryReader для рендеринга текста без наложения, а затем выполните:
if(refreshGeometryReader) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.refreshGeometryReader = false
}
}
Это заставит наложение исчезнуть и снова появиться через 0,1 секунды, и, таким образом, гео обновляется, потому что это Новый экземпляр GeometryReader все вместе.
Это смешно, но работает достаточно хорошо для моих нужд. Надеюсь, кто-нибудь найдет лучший способ заставить GeometryReader обновлять каждый раз, когда он перемещается родителем. Возможно, использование .position
, как предложил @asperi, подойдет кому-то еще. Не имеет смысла для моего конкретного c варианта использования.