使用手势旋转UIView
将UIRotationGestureRecognizer添加到UIView
UIKit具有许多有用的手势识别器。 我发现UIRotationGestureRecognizer比其他手势识别器类更复杂。 我将逐步介绍如何使用UIRotationGestureRecognizer 旋转与用户手势相对应的UIView(或UIView的任何子类) 。
这是您的最终结果。
初始设置
首先,您只需要创建具有所需颜色的UIView。 我选红色。 将其放在情节提要画布上。
从该视图到viewController.swift文件中的ViewController类创建一个插座。
将UIRotationGestureRecognizer添加到UIView
创建当UIRotationGestureRecognizer检测到任何旋转运动时调用的方法。
func rotationView(_ sender:UIRotationGestureRecognizer){
打印(“检测到旋转手势”)
}
将其设置为手势识别器。
覆盖func viewDidLoad(){
super.viewDidLoad()
让rotate = UIRotationGestureRecognizer(目标:自我,行动:#selector(rotatedView(_ :)))
redView.addGestureRecognizer(旋转)
}
现在构建,运行您的项目,并尝试进行任何旋转动作以确保该方法被调用。
检测每个状态
在方法内部,我们可以检测手势何时开始,更改和结束,这些手势识别器的属性称为state和if语句。
func rotationView(_ sender:UIRotationGestureRecognizer){
如果sender.state == .begin {
打印(“开始”)
}如果sender.state == .changed {
打印(“更改中”)
}如果sender.state == .ended {
打印(“结束”)
}
}
让我们运行它,看看它确实可以检测运动状态。
开始旋转手势时应看到“开始”,旋转时应看到“正在变化”,结束旋转时应看到“结束”。 没有任何更改,因为我们没有做任何更新视图的操作。
现在,我们将在三个if语句中添加代码以更新视图。 但是在此之前,让我们了解一下UIRotationGestureRecognizer的工作原理。
了解UIRotationGestureRecognizer的属性
UIRotationGestureRecognizer具有称为旋转的属性。
var轮播:CGFloat
弧度的手势旋转。
rotation是一个增量值 ,用于跟踪视图通过手势旋转了多少弧度。 请注意,这不是一个绝对值,它不能让我们知道当前视图在水平轴上旋转了多少。
完成旋转并重新开始旋转后,此旋转属性将首先变为0并增加。
当您开始旋转时,如果您不希望视图返回到原始旋转(在这种情况下为水平平行),并且希望其将旋转保持为上次旋转并从该旋转继续进行,则可以每次当手指离开屏幕时都可以跟踪旋转情况。
跟踪最后的旋转
为此,我们需要做的是存储完成手势后将要离开屏幕的旋转量,并在下一次开始旋转时使用旋转弧度值。
创建一个名为lastRotation的属性。
var lastRotation:CGFloat = 0
默认值为0,因为您尚未旋转。
在旋转视图方法中,完成旋转后,将sender.rotation分配给lastRotation来存储旋转。
}如果sender.state == .ended {
//保存最后一个旋转
lastRotation = sender.rotation
}
恢复上一轮
当视图开始旋转时,添加originalRotation变量以存储旋转。
var originalRotation = CGFloat()
如果sender.state == .begin {
sender.rotation = lastRotation
originalRotation = sender.rotation
}
将lastRotation分配给sender.rotation可使视图旋转,就像上次旋转视图一样。 否则,视图将返回到默认的水平旋转。 这是因为sender.rotation是增量值,并且默认情况下每次视图开始旋转时将其设置为0。 0
originalRotation = sender.rotation存储视图即将开始旋转时的旋转。
将Delta弧度添加到原始旋转
更改后,我们将更新视图。
}如果sender.state == .changed {
让newRotation = sender.rotation + originalRotation
sender.view?.transform = CGAffineTransform(rotationAngle:newRotation)
}
通过将增量旋转值添加到原始旋转中来获取新旋转,并更新视图。 您应该能够正确旋转。
结论
使用UIGestureRecognizer时,了解什么属性是增量,绝对或相对属性很重要。 一旦了解了每个属性的用途,您就会对使用它充满信心。 您可以在此处的演示项目中查看整个代码。