簡體   English   中英

如何在Swift 3.0的UIView中拖動和縮放UIImageView?

[英]How to drag and zoom UIImageView inside UIView in swift 3.0?

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

在這里,我聲明了mainView和imageView,

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

我已將Pan和Pinch Gesture設置為在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之外。 那么,我該如何解決?

每當縮放子視圖或移動子視圖時,都需要更改子視圖的幀值。 由於frame是UIView的屬性,因此您可以使用KVO對其進行觀察並為它的更改設置一些規則,例如您平移的方式等。

對於框架的KVO,您可以從此處找到更好的解釋

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM