You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:09:10