使用手势旋转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时,了解什么属性是增量,绝对或相对属性很重要。 一旦了解了每个属性的用途,您就会对使用它充满信心。 您可以在此处的演示项目中查看整个代码。