Масштаб изображения не работает в UIScrollView внутри Root UIScrollView - PullRequest
1 голос
/ 26 марта 2020

Я пытаюсь увеличить изображение, которое находится внутри UIScrollView, и что UIScrollView находится внутри root UIScrollView, который позволяет выполнять подкачку страниц, подобно приложению Photos.

В viewDidLoad() внутри представление, которое содержит root scrollView, который я вызываю prepareScrollView()

    func prepareScrollView(){

      let tap = UITapGestureRecognizer(target: self, action: #selector(hideNavigationItem))


      scrollView.addGestureRecognizer(tap)

      scrollView.delegate = self
      scrollView.minimumZoomScale = 1.0
      scrollView.maximumZoomScale = 4.0
      scrollView.zoomScale = 1.0


      let width = self.view.bounds.width
      let height = self.view.bounds.height
      totalWidth = width * CGFloat((imageArray!.count)!) //The width must be the width of the screen by the number of the images in the array
      scrollView.contentSize = CGSize(width: totalWidth, height: height)
      scrollView.isPagingEnabled = true

      loadPages()

}

Функция loadPages() загружает каждый scrollView с их изображением и добавляет его в root представление прокрутки.

func loadPages(){

    for i in 0...((imageArray!.count)! - 1){

        let pageScroll = Page(frame: CGRect(x: self.view.bounds.size.width * CGFloat(i), y: self.view.frame.origin.y, width: self.view.bounds.size.width, height: self.view.bounds.size.height))

        pageScroll.minimumZoomScale = 1.0
        pageScroll.maximumZoomScale = 4.0
        pageScroll.zoomScale = 1.0

        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
        imageView.image = UIImage(data: (imageArray![i])!)
        imageView.contentMode = .scaleToFill
        pageScroll.addSubview(imageView)

        scrollView.addSubview(pageScroll)
    }
}

Объект Page это просто объект UIScrollView.

class Page: UIScrollView {
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return self.subviews[0]//Return the image
}

}

А внутри функции root scrollView viewForZooming он вызывает функцию viewForZooming соответствует дочернему scrollview.

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

    if(self.scrollView.subviews.count > 0){
        let childScrollView = self.scrollView.subviews[currentPage] as! Page
        let image = childScrollView.viewForZooming(in: scrollView)
        return image
    }
    return nil
}

При таком подходе я могу перемещаться по горизонтали, но не могу увеличить текущее изображение. Функция viewForZooming выполняется в обоих объектах. Что я делаю не так?

1 Ответ

0 голосов
/ 27 марта 2020

Наконец-то я решил свою проблему. Я изменил объект Page на простой UIScrollView, а затем установил делегат объекта scrollView на self.

func loadPages(){

    for i in 0...((comic?.comicsPages!.count)! - 1){

        let pageScroll = UIScrollView(frame: CGRect(x: self.view.bounds.size.width * CGFloat(i), y: self.view.frame.origin.y, width: self.view.bounds.size.width, height: self.view.bounds.size.height))

        pageScroll.minimumZoomScale = 1.0
        pageScroll.maximumZoomScale = 4.0
        pageScroll.zoomScale = 1.0
        pageScroll.isUserInteractionEnabled = true
        pageScroll.delegate = self //Here

        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: self.view.bounds.size.width, height: self.view.bounds.size.height))
        imageView.image = UIImage(data: (imageArray![i])!)
        imageView.contentMode = .scaleToFill

        pageScroll.addSubview(imageView)

        scrollView.addSubview(pageScroll)
    }
}

А затем в функции viewForZooming scrollView root я изменяю код для этого:

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

    if(scrollView.subviews.count > 0){
        return scrollView.subviews[0]
    }
    return nil
}

Параметр scrollView является дочерним scrollview, поэтому он работает как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...