Как обновить значения GeometryReader с помощью onRecieve [SwiftUI, macos] - PullRequest
0 голосов
/ 24 января 2020

У меня есть список задач, который отображает строки текста. Я реализовал 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 варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...