我需要根据另一个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
}
此代码可防止用户在屏幕的其他部分启动手势时发生的其他问题。可以在另一个stackoverflow线程上看到详细信息:Rotation gesture produces undesired rotation
对于旋转,如果图标我使用这个函数,我调用它作为touchesMoved的最后一条指令:
func rotateIconsWithImageView (imageview:UIImageView , angle: CGFloat ) {
imageview.transform = CGAffineTransformRotate(tempTransform, -angle)
}
如果我在不改变触摸区域的情况下启动手势,这通常可以正常工作(正如您在gif上看到的那样)。但是如果用户改变了触摸区域,则旋转是错误的,因为我没有使用变换,所以我不确定究竟要做什么。
这个gif说明了这个问题:
提前致谢
答案 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)
}