Почему мой Swift DragGesture влияет на границу моего представления? - PullRequest
0 голосов
/ 06 августа 2020
• 1000 *

Что не так / происходит прямо сейчас:

  • Я нажимаю на представление смайликов, оно превращается go в набор выбранных смайлов, и на нем появляется рамка
  • Я перетаскиваю вид эмодзи с помощью DragGesture, но он очень резкий и не перемещается на все расстояние перетаскивания
  • Как только я завершу sh перетаскивание, граница исчезнет, ​​даже если смайлик все еще в выбранном наборе смайликов
  • Интересно, что если я перетащу смайлик прямо сейчас (когда он находится в наборе выбранных смайлов, но не имеет границы), он переместится на все расстояние перетаскивания, но без любые анимации (т.е. он просто переходит в то место, куда я его перетаскиваю)

Соответствующий код:

ForEach(self.document.emojis) { emoji in
                    Text(emoji.text)
                        .font(animatableWithSize: emoji.fontSize * self.zoomScale)
                        .border(Color.green.opacity(0.6), width: (self.document.selectedEmojis.contains(emoji) ? 4 : 0))
                        .gesture(self.emojiPanGesture().exclusively(before: TapGesture(count: 1).onEnded {
                            self.document.selectedEmojis.toggleMatching(emoji)
                        }))
                        .position(self.position(for: emoji, in: geometry.size))
                        .offset(self.document.selectedEmojis.contains(emoji) ? self.gestureEmojiPanOffset : .zero)

...

@GestureState private var gestureEmojiPanOffset: CGSize = .zero

private var emojiPanOffset: CGSize {
    gestureEmojiPanOffset * zoomScale
}

private func emojiPanGesture() -> some Gesture {
    return DragGesture()
        .updating($gestureEmojiPanOffset) { latestDragGestureValue, gesturePanOffset, transaction in
            gesturePanOffset = latestDragGestureValue.translation
        }
        .onEnded { finalDragGestureValue in
            for emoji in self.document.selectedEmojis {
                self.document.moveEmoji(emoji, by: finalDragGestureValue.translation)
            }
        }
}

Я думал проблема с тем, что смайлики не перемещаются на все расстояние перетаскивание могло быть связано с zoomScale, но я провел все свои тесты с zoomScale = 1. Есть идеи о том, что может происходить?

Дополнительно: если я поместил модификатор границы после модификатора жеста в ForEach l oop, я заметил, что граница появится вокруг всего представления, которое ForEach l oop находится внутри. Я понимаю, что порядок модификаторов часто имеет значение, но мне любопытно, почему модификатор жеста будет иметь такой эффект (в то время как другие модификаторы, такие как модификатор шрифта, не имеют).

...