2017-01-12 14 views
0

swift 3.0を使用してUIViewController(self.view)にないUIView内でUIImageViewをドラッグしてズームします。私はパンを設定し、MAINVIEW内でズームやドラッグImageViewのためにパンとピンチジェスチャーのためのUIImageViewをスウィフト3.0でUIView内でドラッグ&ズームする方法は?

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) 

機能をジェスチャーをつまんでいる

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

ここ

私はMAINVIEWとImageViewのを宣言する必要があり、

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

私はこのコードを実行すると、私はズームmainViewの外に行くイメージビューです。 どうすれば修正できますか?

+0

から、より良い説明を見つけることができます

ますそれにピンチジェスチャーを使用することができます –

+0

@JeckyModi私はすでにパンとピンチジェスチャーを使用してズームとドラッグの画像ビューを作成しています –

+2

このコードを追加してください、私は理解できます –

答えて

0

サブビューのサイズを変更したり、サブビューを移動するたびに、サブビューのフレーム値を変更する必要があります。フレームはUIViewののプロパティなので、あなたはそれを観察するためにKVOを使用して、パンのために行わあなたの方法のようにその変更のいくつかのルールを設定することができますなど、フレームのKVOのために、あなたはhere

関連する問題