Swift: 移动后恢复 UIView 居中

Swift: restoring UIView center after moving it

我正在使用手势来缩放和移动 UIImageView(例如 Instagram 缩放)。当手势结束时,我想恢复 UIImageView 初始位置,但我无法获得初始中心的副本,因为它是引用类型。使用:

let prevCenter = myImage.center

当然没用。我怎样才能复制它?

您确定没有在其他地方更新 prevCenter 吗? center 是结构体,因此复制它应该没有问题。

只要确保在视图处于原始状态时,在开始缩放之前以及在使用正确的框架绘制之后将它(中心)取下来

let imageView = UIImageView(frame: CGRect(x: 10, y: 10, width: 20, height: 20))

let prevCenter = view.center // 20, 20

imageView.center = CGPoint(x: 50, y: 50)

// imageView.center - 50, 50
// prevCenter - 20, 20

imageView.frame = CGRect(x: 40, y: 40, width: 10, height: 10)
// imageView.center - 45, 45
// prevCenter - 20, 20

缩放和移动应用transform查看。最后只需设置 .identity 值。

编辑

示例:

@IBOutlet weak var butt: UIButton!

var offsetTransform: CGAffineTransform = .identity
var zoomTransform: CGAffineTransform = .identity

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.

    let pan = UIPanGestureRecognizer(target: self, action: #selector(onPan(pan:)))
    pan.minimumNumberOfTouches = 2
    pan.delegate = self
    view.addGestureRecognizer(pan)

    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(onPinch(pinch:)))
    pinch.delegate = self
    view.addGestureRecognizer(pinch)
}

@objc func onPinch(pinch: UIPinchGestureRecognizer) {
    let s = pinch.scale
    zoomTransform = CGAffineTransform(scaleX: s, y: s)
    butt.transform = offsetTransform.concatenating(zoomTransform)
    if (pinch.state == .ended) {
        finish()
    }
}

@objc func onPan(pan: UIPanGestureRecognizer) {
    let t = pan.translation(in: view)
    offsetTransform = CGAffineTransform(translationX: t.x, y: t.y)
}

func updatePos() {
    butt.transform = offsetTransform.concatenating(zoomTransform)
}

func finish() {
    butt.transform = .identity
}

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}