使 UIImageview 根据另一个 UIImageview 旋转而旋转

Posted

技术标签:

【中文标题】使 UIImageview 根据另一个 UIImageview 旋转而旋转【英文标题】:Makes an UIImageview rotate depending on another UIImageview rotation 【发布时间】:2016-08-23 19:06:42 【问题描述】:

我需要根据另一个 UIImageview 的当前旋转来使图标旋转。为此,我有一个 UIImageView,其移动由旋转用户手势控制。我还有一个 UIView ,其中包含我需要正确旋转的图标。此 UIView 始终具有与 UIImageview 完全相同的位置和旋转。

这就是我需要做的图形化:

我使用以下代码管理运动:

我使用以下代码管理手势:

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) 

    origin = (touches.first?.locationInView(self.view))!
    xOffSet = CGVector(dx:(origin.x)-rotateImageView.center.x, dy:(origin.y) - rotateImageView.center.y)
    startingAngle = atan2(xOffSet.dy,xOffSet.dx)

    //save the current transform
    tempTransform = rotateImageView.transform


override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) 

    let touch = touches.first

    if touch!.view === rotateImageView  || touch!.view === viewIcons 
        let touchPoint = touches.first?.locationInView(self.view)
        yOffSet = CGVector(dx:touchPoint!.x - rotateImageView.center.x, dy:touchPoint!.y - rotateImageView.center.y)
        let angle = atan2(yOffSet.dy,yOffSet.dx)

        let deltaAngle = angle - startingAngle!

        rotateImageView.transform = CGAffineTransformRotate(tempTransform, deltaAngle)
        viewIcons.transform = CGAffineTransformRotate(tempTransform, deltaAngle)

        rotateIconsWithImageView (ivClock , angle: deltaAngle)
      


 override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) 
    startingAngle = nil


//reset in case drag is cancelled
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) 
    rotateImageView.transform = tempTransform
    startingAngle = nil

此代码可防止当用户在屏幕的另一部分开始手势时发生的另一个问题。详细信息可以在这个另一个***线程上看到:Rotation gesture produces undesired rotation

对于旋转,如果我使用此函数作为 touchesMoved 上的最后一条指令调用的图标:

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat ) 
    imageview.transform = CGAffineTransformRotate(tempTransform, -angle)

如果我在不改变触摸区域的情况下开始手势,这通常可以正常工作(如您在 gif 中看到的那样)。但是,如果用户更改触摸区域,则旋转是错误的,并且由于我不使用 transform 我不确定到底该怎么做。

这个 gif 说明了这个问题:

提前致谢

【问题讨论】:

但这与另一个问题完全相同!我之前告诉过你,你的整个tempTransform 是完全没有必要的。这也是错误的,现在这个事实又回来咬你了。 你能给我完整的代码吗? 【参考方案1】:

摆脱你的tempTransform。这只是让你感到困惑。外轮上的变换和图标上的变换不一样,所以把它们混在一起是很疯狂的:

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat ) 
    imageview.transform = CGAffineTransformRotate(tempTransform, -angle)

相反,只需继续旋转图标的变换

func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat ) 
    imageview.transform = CGAffineTransformRotate(imageview.transform, -angle)

【讨论】:

这也是我在另一个问题上告诉你的,它是对的,即使你没有听。 感谢 matt,但使用 imageview.transform 会使带有图标的图像视图随着运动不断旋转。 因为您为 angle 提供了错误的值。 — 我不会为你编写整个代码。此外,这种“摩天轮”旋转已经在 Stack Overflow 上进行了大量讨论和解释。问题是你没有考虑什么是旋转变换以及你旋转的相对于什么。 例如看这里的讨论:***.com/a/14131927/341994

以上是关于使 UIImageview 根据另一个 UIImageview 旋转而旋转的主要内容,如果未能解决你的问题,请参考以下文章

图像未绑定到UIImageView

在 iOs 中调用按钮 setBackgroundImage 后 UIImageView 位置发生变化

将 UIImageView 添加到 UIButton

使用 CGAffineTransform 使用 UIViewContentModeTop 缩放 UIImageView

使 UIImageView 透明并在触摸时显示其下方的 UIImageView

为啥 uiimageview 的 contentmode 不起作用?