Вызов scrollView.zoom не увеличивает масштаб - PullRequest
0 голосов
/ 05 мая 2020

По какой-то причине scrollView.zoom не увеличивает изображение imageView.

У меня есть imageView внутри scrollView.

in ViewDidLoad:

        scrollView.minimumZoomScale = 1.0
        scrollView.maximumZoomScale = 2.0
        scrollView.delegate = self

viewForZooming:

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

Теперь я звоню ниже после инициализации scrollView и imageView.


var scale: CGFloat = 2

let location = CGPoint(x: imageView.frame.width/2, y: imageView.frame.height/2)
scrollView.zoom(to: zoomRectForScale(scale, center: location), animated: true)

После вызова scrollView.zoom ничего не происходит. Я пробовал сделать

view.setNeedsDisplay()
view.layoutIfNeeded()

По-прежнему ничего не происходит, imageView не увеличивает масштаб.

ОБНОВЛЕНИЕ:

По запросу, вот код для инициализации scrollView и imageView:

func createscrollView(image: UIImage?){

    if image == nil{
        let img = UIImage(named: "demo image.jpg")
        let imgCorrected = scaleAndOrient(image: img!)

        //created user selecged images
        userSelectedImage_UI = img
        userSelectedImage_UI_Corrected = imgCorrected
    }


    // create image scroll view
    scrollView = UIScrollView(frame: CGRect(x: 0, y: 0,width: 100, height: 100))
    scrollView.showsHorizontalScrollIndicator = false
    scrollView.showsVerticalScrollIndicator = false
    scrollView.bouncesZoom = false
    scrollView.bounces = false
    scrollView.contentMode = .scaleAspectFill

    view.addSubview(scrollView)

    scrollView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 0),
        scrollView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor, constant: 0),
        scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -150),
        scrollView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor, constant: 0)
    ])


    // add image view to scrollview
    imageView = UIImageView(frame: CGRect(x: 0, y: 0,width: 100, height: 100))
    scrollView.addSubview(imageView)

    imageView.translatesAutoresizingMaskIntoConstraints = false

    NSLayoutConstraint.activate([
        imageView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor, constant: 0),
        imageView.leftAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leftAnchor, constant: 0),
        imageView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor, constant: 0),
        imageView.rightAnchor.constraint(equalTo: scrollView.contentLayoutGuide.rightAnchor, constant: 0),
        imageView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, multiplier: 1),
        imageView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, multiplier: 1)
    ])

    imageView.contentMode = .scaleAspectFit

    if image == nil{
        imageView.image = userSelectedImage_UI_Corrected

    } else {
        imageView.image = scaleAndOrient(image: image!)
    }


}

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

На основе комментариев ...

Похоже, вы создаете / настраиваете свой scrollView и его содержимое imageView из viewDidLoad(), а затем сразу же пытаетесь его «увеличить».

Если да, то это будет проблематично c, так как автоматическая компоновка не завершила размещение элементов пользовательского интерфейса.

Вы можете вызвать его из:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    var scale: CGFloat = 2
    let location = CGPoint(x: imageView.frame.width/2, y: imageView.frame.height/2)
    scrollView.zoom(to: zoomRectForScale(scale, center: location), animated: true)
}
0 голосов
/ 06 мая 2020

У меня такое чувство, что проблема в вашей функции zoomRectForScale, хотя она не опубликована. Это должно быть примерно так:

func zoomRectForScale(_ scale: CGFloat, center: CGPoint) -> CGRect {
    var zoomRect = CGRect.zero
    zoomRect.size.height = imageView.frame.size.height / scale
    zoomRect.size.width = imageView.frame.size.width / scale
    let newCenter = scrollView.convert(center, from: imageView)
    zoomRect.origin.x = newCenter.x - (zoomRect.size.width / 2.0)
    zoomRect.origin.y = newCenter.y - (zoomRect.size.height / 2.0)
    return zoomRect
}

Кроме того, я проверил, что двойное нажатие для увеличения работает в правильном месте, используя:

var gestureRecognizer: UITapGestureRecognizer!

// Sets up the gesture recognizer that receives double taps to auto-zoom
func setupGestureRecognizer() {
    gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleDoubleTap))
    gestureRecognizer.numberOfTapsRequired = 2
    scrollView.addGestureRecognizer(gestureRecognizer)
}

// Handles a double tap by either resetting the zoom or zooming to where was tapped
@IBAction func handleDoubleTap() {
    if scrollView.zoomScale == 1 {
        scrollView.zoom(to: zoomRectForScale(scrollView.maximumZoomScale, center: gestureRecognizer.location(in: gestureRecognizer.view)), animated: true)
    } else {
        scrollView.setZoomScale(1, animated: true)
    }
}

Не забудьте позвонить это в viewDidLoad:

setupGestureRecognizer()

Если это не решит вашу проблему, измените свой вопрос, указав отсутствующие функции кода и объявления переменных.

...