UIScrollView
の中に設定されているUIImageView
のピンチズームに問題があります。画像はユーザーのピンチ入力に応じてズームしますが、画像は拡大して、UIScrollView
の境界内にとどまるのではなく、画面全体を占めるまで拡大します。私は問題の原因を見つけようとするが、何かを見つけることができなかった、SOのさまざまな質問、記事、YouTubeビデオのヒープを見てきた。Swift - UIImageViewがUIScrollViewより大きくズームします
SO以下の質問が緩く関連するように見えるが、私はまだそれらを見た後、私の問題を解決できませんでした:
- content size of UIScrollView
-
- UIScrollView squashes UIImageView image
- Swift UIImageView Stretched Aspect
- UIImageView pinch zoom swift
私のストーリーボードに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
を実装しています
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
希望
この変更:self.scrollView.clipsToBounds = false to this self.scrollView.clipsToBounds = true –
@MohammadBashirSidani伝説!どうもありがとう、私はこれで髪を引き裂いていた。答えとして追加したい場合は、私はそれを受け入れます。 –
とてもうれしいです!私は答えとしてそれを追加します、ありがとう! –