SwiftUI中如何让仅部分显示在视图内的路径整体响应拖拽手势?
SwiftUI中如何让仅部分显示在视图内的路径整体响应拖拽手势?
嘿,这个问题我之前也碰到过!原因其实很简单:你现在只给路径加了stroke描边,SwiftUI的手势命中测试只会识别到描边的那几条线的区域,所以才会只有部分地方能触发拖拽。而你视觉上看到的椭圆和线条,很多区域是没有被命中测试覆盖到的。
解决方法超简单,只需要给你的Path视图加一行透明填充就行,这样整个路径的范围(包括椭圆内部)都会被当作可交互区域,不管是不是描边的部分:
修改代码中的这一段:
.myCustomPathTest .scale(x: 1.0, y: -1.0) .fill(Color.clear) // 新增这行透明填充,扩大手势命中区域 .stroke(Color.black, lineWidth: 5.0) .offset(x: pathCurrentOffset.width + geometryValue.size.width/2.0, y: -pathCurrentOffset.height - geometryValue.size.height/2.0) .gesture(pathDragGesture)
为什么这行代码有用?因为fill(Color.clear)虽然完全看不到,但它会告诉SwiftUI:整个路径的封闭区域都是这个视图的可交互范围,手势就会对整个视觉上的形状生效,而不只是描边的线条了。
你也可以试试另一种等价方案,用.contentShape来手动指定命中区域,比如在.gesture前面添加:
.contentShape(myCustomPathTest.scale(x: 1.0, y: -1.0))
不过透明填充的方法更直接,不需要额外处理路径的变换逻辑,实际效果是完全一致的。
改完之后,你拖拽视觉上路径的任何部分,整个图形都会跟着移动啦!
备注:内容来源于stack exchange,提问作者swiftPunk
相关产品推荐
相关产品推荐

