在旋转视图上调整拖动手势

Posted

技术标签:

【中文标题】在旋转视图上调整拖动手势【英文标题】:Adjust Drag Gesture on Rotated View 【发布时间】:2021-10-09 08:03:00 【问题描述】:

我有一个视图上的图像。

添加旋转以旋转视图 添加了拖动手势以平移图像 图像未旋转时,拖动手势可以正常工作 一旦视图旋转到某个角度,拖动手势就会受到干扰,因为视图已旋转。

那么,如何根据旋转角度调整dragOffset和位置?

代码:

struct ImageView: View 
    @State private var dragOffset: CGSize = .zero
    @State private var position: CGSize = .zero
    
    @State private var currentRotation: Angle = .zero
    @GestureState private var twistAngle: Angle = .zero
    
    public var body: some View 
        let rotationGesture = RotationGesture(minimumAngleDelta: .degrees(10))
            .updating($twistAngle, body:  (value, state, _) in
                state = value
            )
            .onEnded self.currentRotation += $0 
        
        let dragGesture = DragGesture()
            .onChanged( (value) in
                self.dragOffset = value.translation
            )
            .onEnded( (value) in
                self.position.width += value.translation.width
                self.position.height += value.translation.height
                self.dragOffset = .zero
            )
        
        let gestures = rotationGesture
            .simultaneously(with: dragGesture)
        
        Image.placeholder320x192
            .offset(x: dragOffset.width + position.width, y: dragOffset.height + position.height)
            .rotationEffect(currentRotation + twistAngle)
            .gesture(gestures, including: .gesture)
    

【问题讨论】:

不是很清楚你需要什么。旋转只是一种视觉效果,视图的框架和坐标系(包括在事件中使用,在这种情况下拖动)保持不变。 @Asperi - 当我从上到下拖动视图时,它应该从上到下拖动,但由于视图是旋转的,视图会以旋转角度平移/拖动,这对用户不友好。 【参考方案1】:

修饰符的顺序很重要。您当前有 offset before 旋转 - 因此您正在应用偏移 then 旋转。这使得偏移出现在一个角度。相反,您想旋转然后偏移。

变化:

Image.placeholder320x192
    .offset(x: dragOffset.width + position.width, y: dragOffset.height + position.height)
    .rotationEffect(currentRotation + twistAngle)
    .gesture(gestures, including: .gesture)

到这里:

Image.placeholder320x192
    .rotationEffect(currentRotation + twistAngle)
    .offset(x: dragOffset.width + position.width, y: dragOffset.height + position.height)
    .gesture(gestures, including: .gesture)

【讨论】:

完美!虽然我有一个尾随查询,但我的视图在播放后“同时”添加触摸和放大手势时不会响应触摸。添加两个以上的手势是否正确? @Bista 是的,根据需要添加任意数量的转换和手势

以上是关于在旋转视图上调整拖动手势的主要内容,如果未能解决你的问题,请参考以下文章

转iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) -- 不错不错

touch.js 拖动缩放旋转 (鼠标手势)

touch.js 拖动缩放旋转 (鼠标手势)

手势识别(拖动,旋转,捏合)

跨多个子视图的 SwiftUI 拖动手势

iOS 手势操作:拖动捏合旋转点按长按轻扫自定义