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

时间:2016-08-23 19:06:42

标签: swift uiimageview uigesturerecognizer cgaffinetransform

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

图形上这就是我需要做的事情:

enter image description here

我使用此代码管理动议:

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

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
}

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

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

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

如果我在不改变触摸区域的情况下启动手势,这通常可以正常工作(正如您在gif上看到的那样)。但是如果用户改变了触摸区域,则旋转是错误的,因为我没有使用变换,所以我不确定究竟要做什么。

这个gif说明了这个问题:

enter image description here

提前致谢

1 个答案:

答案 0 :(得分:0)

摆脱你的tempTransform。这让你很困惑。外轮上的变换与图标上的变换不同,所以将它们混合起来是很麻烦的:

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

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

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