简体   繁体   English

Swift:移动后恢复UIView中心

[英]Swift: restoring UIView center after moving it

I'm using gestures to zoom and move a UIImageView (like Instagram zoom, for example). 我正在使用手势缩放和移动UIImageView(例如,Instagram缩放)。 When the gesture ends, I want to restore UIImageView initial position, but I cannot get a copy of the initial center because it's a reference type. 手势结束后,我想恢复UIImageView的初始位置,但是由于它是参考类型,所以无法获得初始中心的副本。 Using: 使用:

let prevCenter = myImage.center

is of course useless. 当然是没用的。 How can I copy it? 我该如何复制?

On zoom and move apply transform to view. 缩放并移动时,将transform应用于视图。 On the end just set .identity value. 最后,只需设置.identity值即可。

Edit 编辑

Example: 例:

@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
}

Are you sure that you are not updating the prevCenter somewhere else? 您确定没有在prevCenter地方更新prevCenter吗? center is struct so you shouldn't have problems copying it. center是struct,因此复制它应该没有问题。

Just make sure to take it (the center) when the view is in original state, before starting to zoom it and after it is drawn with correct frame 只需在视图处于原始状态时,开始缩放之前以及在使用正确的框架绘制视图后确保将其(居中)

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM