SwiftUI中如何显示选中Emoji的实时缩放交互过程
问题根因
选中Emoji缩放无实时反馈的核心原因是:
- 你已经定义了
@GestureState private var gestureZoomScaleEmoji: CGFloat = 1用来接收缩放手势过程中的实时变化值,但完全没有将这个值应用到选中Emoji的渲染逻辑中。 - 当前所有Emoji的缩放仅绑定了全局画布的
zoomScale,手势进行中临时的Emoji缩放值没有参与UI计算,只有手势结束调用document.scaleEmoji修改数据模型时才会触发UI更新,因此出现结束后直接跳转到最终状态的问题。 - 附带的小问题:Emoji拖拽手势中误用了不存在的
distance属性,应该用translation获取拖拽偏移,否则会出现拖拽位置异常。
修改步骤
只需要修改EmojiArtDocumentView.swift中的两处代码即可:
1. 给选中Emoji叠加临时缩放值
找到ForEach循环中Emoji的scaleEffect修饰符,将原来的全局缩放逻辑改为:选中状态下额外乘上手势实时缩放值。
原来的代码:
Text(emoji.text) .font(.system(size: fontSize(for: emoji))) .border(Color.blue, width: selectedEmojis.contains(emoji) ? 2 : 0) .scaleEffect(zoomScale) .position(position(for: emoji, in: geometry))
修改为:
Text(emoji.text) .font(.system(size: fontSize(for: emoji))) .border(Color.blue, width: selectedEmojis.contains(emoji) ? 2 : 0) // 选中Emoji叠加手势临时缩放值,非选中Emoji保持全局画布缩放 .scaleEffect(selectedEmojis.contains(emoji) ? zoomScale * gestureZoomScaleEmoji : zoomScale) .position(position(for: emoji, in: geometry))
2. 修复Emoji拖拽偏移计算错误
找到panEmojiGesture的实现,将其中错误的distance属性替换为translation(DragGesture的偏移量存储在translation属性中):
原来的代码:
private func panEmojiGesture() -> some Gesture { DragGesture() .updating($gestureEmojiPanOffset) { latestDragGestureValue, gestureEmojiPanOffset, _ in gestureEmojiPanOffset = latestDragGestureValue.distance / zoomScale } .onEnded { finalDragGestureValue in for emoji in selectedEmojis { document.moveEmoji(emoji, by: finalDragGestureValue.distance / zoomScale) } } }
修改为:
private func panEmojiGesture() -> some Gesture { DragGesture() .updating($gestureEmojiPanOffset) { latestDragGestureValue, gestureEmojiPanOffset, _ in gestureEmojiPanOffset = latestDragGestureValue.translation / zoomScale } .onEnded { finalDragGestureValue in for emoji in selectedEmojis { document.moveEmoji(emoji, by: finalDragGestureValue.translation / zoomScale) } } }
效果说明
修改后:
- 未选中Emoji时,捏合缩放依然作用于整个画布,逻辑不变
- 选中Emoji时,捏合过程中
gestureZoomScaleEmoji实时更新,驱动选中Emoji的scaleEffect实时变化,实现跟手的缩放渲染 - 手势结束后,
@GestureState修饰的gestureZoomScaleEmoji会自动重置为1,同时缩放比例被持久化到Emoji的模型数据中,全程无跳变 - Emoji拖拽偏移计算恢复正常,不会出现拖拽错位问题
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

