Ios 为什么使用UIScrollView';s的内容不居中?

Ios 为什么使用UIScrollView';s的内容不居中?,ios,swift,Ios,Swift,我将UIImageView嵌入UIContentView中,以使其可缩放和可移动(.问题是图像未正确居中。看起来整个图像内容已从左上角移出: 打印内容偏移量接近零时:内容偏移量为:(0.0,-20.0) 以下是我的实现: import UIKit class ZoomableImageView: UIScrollView { private struct Constants { static let minimumZoomScale: CGFloat = 0.5;

我将
UIImageView
嵌入
UIContentView
中,以使其可缩放和可移动(.问题是图像未正确居中。看起来整个图像内容已从左上角移出:

打印内容偏移量接近零时:
内容偏移量为:(0.0,-20.0)

以下是我的实现:

import UIKit

class ZoomableImageView: UIScrollView {

    private struct Constants {
        static let minimumZoomScale: CGFloat = 0.5;
        static let  maximumZoomScale: CGFloat = 6.0;
    }


    // public so that delegate can access
    public let imageView = UIImageView()

    // gw: must be called to complete a setting
    public func setImage(image: UIImage) {
        imageView.image = image
        imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)

        self.contentSize = image.size


        let scaleFitZoomScale: CGFloat = min(
        self.frame.width / image.size.width ,
        self.frame.height / image.size.height
        )


        // reset scale and offset on each resetting of image
        self.zoomScale = scaleFitZoomScale
    }


    // MARK - constructor
    init() {
        // gw: there is no super.init(), you have to use this constructor as hack
        super.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) // gw: relies on autolayout constraint later

        minimumZoomScale = Constants.minimumZoomScale
        maximumZoomScale = Constants.maximumZoomScale

        addSubview(imageView)


    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }



}
视图控制器:

class ViewController: UIViewController, UIScrollViewDelegate {


    let zoomableImageView  = ZoomableImageView()


    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(zoomableImageView)
        zoomableImageView.delegate = self

    }

    override func viewDidLayoutSubviews() {

        zoomableImageView.frame = view.frame
        let image = UIImage(imageLiteralResourceName: "kelly")
        zoomableImageView.setImage(image: image)

    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        // print("scale factor is: \(scrollView.zoomScale)")
        return zoomableImageView.imageView
    }

    func scrollViewDidZoom(_ scrollView: UIScrollView) {
         print("scale factor is: \(scrollView.zoomScale)")
    }

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        print("content offset is: \(scrollView.contentOffset)")
    }



}
但是,如果我不将
UIImageView
UIScrollView
包装在自定义类下,图像的居中效果非常好:

class ViewController: UIViewController, UIScrollViewDelegate {


    let imageView: UIImageView = {
        let image = UIImage(imageLiteralResourceName: "kelly")
        let imageView = UIImageView(image: image)
        imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height)
        return imageView
    } ()

    let scrollView: UIScrollView = {
        let scrollView = UIScrollView()
        return scrollView
    } ()
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        view.addSubview(scrollView)
        scrollView.addSubview(imageView)


        scrollView.delegate = self
        self.scrollView.minimumZoomScale = 0.5;
        self.scrollView.maximumZoomScale = 6.0;

    }

    override func viewDidLayoutSubviews() {
        scrollView.frame = view.frame

        if let size = imageView.image?.size {
            scrollView.contentSize = size
        }



    }

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }


}

我在第一个实现中遗漏了什么吗?

缩放图像视图
类中,您正在设置
边界
当它应该是

因此,改变:

imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) 


ZoomableImageView
类中,您正在设置
边界
当它应该是

因此,改变:

imageView.bounds = CGRect(x: 0, y: 0, width: image.size.width, height: image.size.height) 


不完全清楚您想要什么…如果图像的实际大小小于scrollView框架(根据您的代码,它是完整的主视图框架),是否希望图像最初在水平和垂直方向居中显示?如果图像大于框架,是否希望图像居中,但已缩放以使整个图像可见?还是居中,使侧面/顶部和底部延伸到scrollView框架之外?我正在尝试使图像左上角与Scroll匹配l查看左上角。这是使用第二个IML自动实现的,但是第一个IML的行为不同(图像从左上角移出)OK-我认为很简单,在您的
ZoomableImageView
类中,您正在设置
bounds
当它应该是
frame
——所以更改
imageView.bounds=cRect(x:0,y:0,width:image.size.width,height:image.size.height)
imageView.frame=…
@DonMag工作得很好。该死的UI编程很难。我添加了这个作为答案,以便将来可能遇到它的任何人都能看到“修复”。不完全清楚您想要什么…如果图像的实际大小小于scrollView框架(根据您的代码,它是完整的主视图框架),是否希望图像最初在水平和垂直方向居中显示?如果图像大于框架,是否希望图像居中,但已缩放以使整个图像可见?还是居中,使侧面/顶部和底部延伸到scrollView框架之外?我正在尝试使图像左上角与Scroll匹配l查看左上角。这是使用第二个IML自动实现的,但是第一个IML的行为不同(图像从左上角移出)OK-我认为很简单,在您的
ZoomableImageView
类中,您正在设置
bounds
当它应该是
frame
——所以更改
imageView.bounds=cRect(x:0,y:0,width:image.size.width,height:image.size.height)
imageView.frame=…
@DonMag工作得很好。该死的UI编程很难。我添加了这个作为一个答案,以便将来可能遇到它的任何人都能看到“修复”。