2017-08-15 6 views
1

UIScrollViewの中に設定されているUIImageViewのピンチズームに問題があります。画像はユーザーのピンチ入力に応じてズームしますが、画像は拡大して、UIScrollViewの境界内にとどまるのではなく、画面全体を占めるまで拡大します。私は問題の原因を見つけようとするが、何かを見つけることができなかった、SOのさまざまな質問、記事、YouTubeビデオのヒープを見てきた。Swift - UIImageViewがUIScrollViewより大きくズームします

SO以下の質問が緩く関連するように見えるが、私はまだそれらを見た後、私の問題を解決できませんでした:

私のストーリーボードにMy UIScrollViewが作成され、インターフェイスビルダーで作成されたレイアウト制約を使用して、その場所に固定しました。スクロールビューのデリゲートをviewDidLoad()でselfに設定しました(クラスの先頭にUIScrollViewDelegateが追加されています)。 UIImageViewはプログラムによって作成されます。私は以下のようにクラスの先頭にイメージ図を宣言:

class VCImageViewer: UIViewController, UIScrollViewDelegate { 
@IBOutlet weak var lblImageTitle: UILabel! 
@IBOutlet weak var btnBack: UIButton! 
@IBOutlet weak var scrollView: UIScrollView! 

var imageView:UIImageView = UIImageView() // <-- Image view 

私はその後、viewDidLoad()中に呼び出されるコードのフォローラインと私のUIScrollViewのサブビュー、などの画像ビューを追加します。

self.scrollView.addSubview(self.imageView) 

画像ビューをスクロールビューに追加した後、画像を画像ビューに読み込みます。私は、URLからイメージを取得し、次のコードを使用してロードします。再び、これはviewDidLoad()で呼び出されます。

self.imageView.image = UIImage(data: data) 
      self.imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: (self.imageView.image?.size)!) 
      if self.imageView.image != nil { 
       self.lblError.isHidden = true 
       self.FormatImageViewerWithImage() 
      } 

これは、画像が正しく読み込まれたことを確認し、それがいなかった場合、私は表示するであろう警告ラベルを隠し、かつ以下である、self.FormatImageViewerWithImage()を呼び出します。

func FormatImageViewerWithImage() { 
    // Constraints 
    let constraintImageViewTop:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.top, multiplier: 1, constant: 0) 
    let constraintImageViewBottom:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.bottom, multiplier: 1, constant: 0) 
    let constraintImageViewLeft:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.left, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.left, multiplier: 1, constant: 0) 
    let constraintImageViewRight:NSLayoutConstraint = NSLayoutConstraint(item: self.imageView, attribute: NSLayoutAttribute.right, relatedBy: NSLayoutRelation.equal, toItem: self.scrollView, attribute: NSLayoutAttribute.right, multiplier: 1, constant: 0) 
    self.view.addConstraints([constraintImageViewTop, constraintImageViewBottom, constraintImageViewLeft, constraintImageViewRight]) 

    self.scrollView.contentSize = self.imageView.image!.size 
    self.scrollView.clipsToBounds = false 
    let scrollViewFrame = scrollView.frame 
    let scaleWidth = scrollViewFrame.size.width/self.scrollView.contentSize.width 
    let scaleHeight = scrollViewFrame.size.height/self.scrollView.contentSize.height 
    let minScale = min(scaleWidth, scaleHeight) 
    self.scrollView.minimumZoomScale = minScale 

    self.scrollView.maximumZoomScale = 1.0 
    self.scrollView.zoomScale = minScale 
} 

私もでscrollViewDidZoomを実装しています

0:と

func scrollViewDidZoom(_ scrollView: UIScrollView) { 
    self.CentreScrollViewContents() 
} 
func CentreScrollViewContents() { 
    let boundsSize = self.scrollView.bounds.size 
    var contentsFrame = self.imageView.frame 
    if contentsFrame.size.width < boundsSize.width { 
     contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width)/2 
    } else { 
     contentsFrame.origin.x = 0 
    } 
    if contentsFrame.size.height < boundsSize.height { 
     contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height)/2 
    } else { 
     contentsFrame.origin.y = 0 
    } 
    self.imageView.frame = contentsFrame 
} 

viewWillLayoutSubviews()にコードを追加することを示唆していた上記の質問を見たことがありますが、私はこれで成功していないので、viewWillLayoutSubviews()は空です。

誰かが私が間違っていることを見ることができますか?この行に

self.scrollView.clipsToBounds = false 

::このことができます

self.scrollView.clipsToBounds = true 

希望

+1

この変更:self.scrollView.clipsToBounds = false to this self.scrollView.clipsToBounds = true –

+0

@MohammadBashirSidani伝説!どうもありがとう、私はこれで髪を引き裂いていた。答えとして追加したい場合は、私はそれを受け入れます。 –

+0

とてもうれしいです!私は答えとしてそれを追加します、ありがとう! –

答えて

1

は、この行を変更してください!

関連する問題