UIPinchGestureRecognizer 是 iOS 开发中用于识别捏合手势(即两个手指进行放大或缩小操作)的手势识别器。当用户对屏幕上的某个 UIView 进行捏合操作时,UIPinchGestureRecognizer 会被触发,并且可以通过它来获取捏合的比例因子(scale factor),从而可以相应地调整 UIView 的大小。
import UIKit
class ViewController: UIViewController {
var pinchGesture: UIPinchGestureRecognizer!
var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
// 初始化 UIView
myView = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
myView.backgroundColor = .blue
view.addSubview(myView)
// 初始化 UIPinchGestureRecognizer 并添加到 UIView
pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(handlePinch(_:)))
myView.addGestureRecognizer(pinchGesture)
myView.isUserInteractionEnabled = true
}
@objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
// 根据捏合的比例因子调整 UIView 的大小
let scale = gesture.scale
myView.transform = CGAffineTransform(scaleX: scale, y: scale)
// 重置比例因子,以便下次手势识别时能够正确计算
gesture.scale = 1.0
}
}
问题:UIView 在缩放时位置发生了偏移。
原因:使用 CGAffineTransform 进行缩放时,默认是以 UIView 的中心点为基准进行缩放的。如果 UIView 的初始位置不是以中心点对齐,缩放时可能会出现位置偏移。
解决方法:可以通过调整 UIView 的 center 属性来确保缩放时以中心点为基准,或者在应用 CGAffineTransform 之前先调整 UIView 的 frame。
@objc func handlePinch(_ gesture: UIPinchGestureRecognizer) {
let scale = gesture.scale
let currentTransform = myView.transform
let newTransform = currentTransform.scaledBy(x: scale, y: scale)
myView.transform = newTransform
// 保持缩放中心不变
let center = CGPoint(x: myView.bounds.midX, y: myView.bounds.midY)
myView.center = center
gesture.scale = 1.0
}
通过上述方法,可以确保 UIView 在缩放时保持正确的位置和大小。
领取专属 10元无门槛券
手把手带您无忧上云