[英]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.