gpt4 book ai didi

ios - 如何在 swift 3.0 中拖动和缩放 UIView 内的 UIImageView ?

转载 作者:行者123 更新时间:2023-11-30 12:46:12 25 4
gpt4 key购买 nike

我想使用 swift 3.0 在 UIView 中而不是在 UIViewController (self.view) 中拖动和缩放 UIImageView。

这里我声明了mainView和imageView,

var lastScale: CGFloat = 0.0
@IBOutlet var mainView: UIView!
@IBOutlet var imageView: UIImageView!

我已经在 mainView 中设置了平移和捏合手势来缩放和拖动 ImageView

let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(ViewController.handlePinchGesture(_:)))
imageView.isUserInteractionEnabled = true
imageView.addGestureRecognizer(pinchGestureRecognizer)

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handlePanGesture(recognizer:)))
imageView.addGestureRecognizer(panGestureRecognizer)

平移和捏合手势功能

func handlePinchGesture(_ gestureRecognizer: UIPinchGestureRecognizer) {
if gestureRecognizer.state == .began {
lastScale = gestureRecognizer.scale
}

if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
let currentScale: CGFloat = (gestureRecognizer.view!.layer.value(forKeyPath: "transform.scale")! as! CGFloat)

// Constants to adjust the max/min values of zoom
//let kMaxScale: CGFloat = 2.0
let kMinScale: CGFloat = 1.0

var newScale: CGFloat = 1 - (lastScale - gestureRecognizer.scale)

//newScale = min(newScale, kMaxScale / currentScale)
newScale = max(newScale, kMinScale / currentScale)

let transform = gestureRecognizer.view?.transform.scaledBy(x: newScale, y: newScale)
gestureRecognizer.view?.transform = transform!

lastScale = gestureRecognizer.scale
}
}

func handlePanGesture(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translation(in: mainView)
var recognizerFrame = recognizer.view?.frame
recognizerFrame?.origin.x += translation.x
recognizerFrame?.origin.y += translation.y
// Check if UIImageView is completely inside its superView
if mainView.bounds.contains(recognizerFrame!) {
recognizer.view?.frame = recognizerFrame!
}
else {
// Check vertically
if (recognizerFrame?.origin.y)! < mainView.bounds.origin.y {
recognizerFrame?.origin.y = 0
}
else if (recognizerFrame?.origin.y)! + (recognizerFrame?.size.height)! > mainView.bounds.size.height {
recognizerFrame?.origin.y = mainView.bounds.size.height - (recognizerFrame?.size.height)!
}

// Check horizantally
if (recognizerFrame?.origin.x)! < mainView.bounds.origin.x {
recognizerFrame?.origin.x = 0
}
else if (recognizerFrame?.origin.x)! + (recognizerFrame?.size.width)! > mainView.bounds.size.width {
recognizerFrame?.origin.x = mainView.bounds.size.width - (recognizerFrame?.size.width)!
}
}

// Reset translation so that on next pan recognition
// we get correct translation value
recognizer.setTranslation(CGPoint(x: CGFloat(0), y: CGFloat(0)), in: mainView)
}

当我运行此代码时,我缩放 imageView,它超出了 mainView。那么,我该如何解决?

最佳答案

每当您缩放 subview 或移动 subview 时,都需要更改 subview 的帧值。因为frame是UIView的一个属性,所以你可以使用KVO来观察它并为其变化设置一些规则,就像你对平移所做的那样。

对于frame的KVO,可以在here找到更好的解释

关于ios - 如何在 swift 3.0 中拖动和缩放 UIView 内的 UIImageView ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com