SwiftUI中使用onDrag拖拽单个Text却拖动整个集合的问题解决
问题解决方法
你的问题根源在于两个点:一是ForEach的唯一标识重复,二是拖动区域未明确限定,导致SwiftUI误将整个表情串识别为拖动对象。按以下步骤修改即可:
1. 为每个表情生成唯一ID
原来的ForEach用id: \.self,如果表情重复,ID会冲突,SwiftUI无法区分单个表情。改用enumerated()给每个表情绑定索引作为唯一标识,确保每个元素在SwiftUI中独立。
2. 明确拖动交互区域
添加contentShape(Rectangle()),强制SwiftUI将整个Text的矩形区域作为拖动触发区域,避免父视图的HStack被误识别为拖动源。
修改后的完整ScrollingEmojisView代码
struct ScrollingEmojisView: View { let emojis: String var body: some View { ScrollView(.horizontal) { HStack { ForEach(Array(emojis.enumerated()), id: \.offset) { index, emoji in Text(String(emoji)) .contentShape(Rectangle()) .onDrag { NSItemProvider(object: String(emoji) as NSString) } } } } } }
修改后,每个表情都会被识别为独立的可拖动元素,拖动单个表情时就不会带动整个字符串了。
内容的提问来源于stack exchange,提问作者reactor
相关产品推荐
相关产品推荐

