缩放包含子视图的UIImageView

时间:2019-04-18 10:57:45

标签: ios swift uiscrollview uiimageview zoom

我在UIImageView中有一个UIScrollView对象(要缩放)。此外,UIImageView还包含子视图。我正在使用以下功能放大UIImageView

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

它对于UIImageView来说效果很好。

问题在于缩放这些子视图时,它们也以相同的方式缩放这些子视图。有没有办法禁用这些子视图的缩放?

2 个答案:

答案 0 :(得分:1)

有很多方法可以实现这一目标。我想说,最简单的方法就是简单地缩小视图的比例。这就是我用作演示的内容:

class ViewController: UIViewController {

    @IBOutlet private var scrollView: UIScrollView?
    private var imageView: UIImageView?
    private var annotations: [UIView] = [UIView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let imageView = UIImageView(image: UIImage(named: "background"))
        scrollView?.addSubview(imageView)
        scrollView?.contentSize = imageView.bounds.size
        scrollView?.maximumZoomScale = 5.0
        self.imageView = imageView

        scrollView?.delegate = self

        applyAnnotationView({
            let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 10.0, height: 10.0))
            view.backgroundColor = UIColor.red
            view.layer.cornerRadius = view.bounds.width*0.5
            return view
        }(), at: CGPoint(x: 100.0, y: 100.0))

        applyAnnotationView({
            let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 10.0, height: 10.0))
            view.backgroundColor = UIColor.green
            view.layer.cornerRadius = view.bounds.width*0.5
            return view
        }(), at: CGPoint(x: 200.0, y: 200.0))
    }

    func applyAnnotationView(_ view: UIView, at position: CGPoint) {
        view.center = position
        annotations.append(view)
        imageView?.addSubview(view)
    }

}

// MARK: - UIScrollViewDelegate

extension ViewController: UIScrollViewDelegate {

    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        annotations.forEach { item in
            item.transform = CGAffineTransform(scaleX: 1.0/scrollView.zoomScale, y: 1.0/scrollView.zoomScale)
        }
    }

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

}

只需应用CGAffineTransform(scaleX: 1.0/scrollView.zoomScale, y: 1.0/scrollView.zoomScale)即可完成所有工作。即使使用约束也应该可以。

答案 1 :(得分:0)

位于UIImageView内部的UIView始终具有相同的大小,但将锚定到图像中的特定点(顶部10%,左侧10%):

var item: UIView?

override func viewDidLoad() {
    ...
    item = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 200))
    setPosition()
    item?.backgroundColor = UIColor.red
    imageView.addSubview(item!)
    ...
}

func setPosition() {
    let x = imageView.frame.size.width/10
    let y = imageView.frame.size.height/10
    item?.frame = CGRect(x: x, y: y, width: 200, height: 200)
}

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    ...
    setPosition()
    ...
}

您可以使用以下公式来使用确切的数字,而不是10%:

x = startPosition/startWidthImage*currentWidthImage