Масштабирование UIImageView, который содержит подпредставления - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть UIImageView объект в UIScrollView (для увеличения).Кроме того, UIImageView также содержит подпредставления.Я использую следующую функцию для увеличения UIImageView.

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

Он отлично работает для UIImageView.

Проблема в том, что при масштабировании этих подпредставлений они также увеличивают эти подпредставления таким же образом.Есть ли способ отключить масштабирование для этих подпредставлений?

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Есть много способов достичь этого. Я бы сказал, что самый простой способ - просто изменить свои взгляды. Вот что я использовал в качестве демонстрации:

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) делает всю работу. Все должно быть хорошо, даже если используются ограничения.

0 голосов
/ 18 апреля 2019

UIView, который находится внутри UIImageView, всегда будет иметь одинаковый размер, но будет привязан к определенной точке изображения (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
...