Сбой во время прокрутки, потому что границы возвращаются как ноль - PullRequest
0 голосов
/ 02 июля 2018

Мое приложение падает с этим сообщением:

'CALayerInvalidGeometry', причина: 'CALayer position содержит NaN: [nan nan]'

Это потому, что мой масштаб увеличения рассчитывается как бесконечность (делим на ноль)

Я пытаюсь поэкспериментировать с отсутствием раскадровок, поэтому все делается программно. У меня есть два ViewController's. Источник ViewController помещает новый ViewController в стек следующим образом:

..
let destinationVC  = DetailViewController()
destinationVC.setWith(img: photo)
navigationController?.pushViewController(destinationVC, animated: true)
...

Теперь мой destinationVC падает, когда я уменьшаю свой scrollView. Это потому, что в updateMinZoomScaleForSize bounds возвращаются как 0. Я пытался вызвать эту функцию в нескольких других местах:

  1. viewDidLayoutSubviews - по-прежнему вылетает
  2. viewWillLayoutSubviews - по-прежнему вылетает
  3. viewWillAppear - все еще падает
  4. viewDidAppear - без сбоев, но изображение «прыгает» на место

Я также пытался вызвать image.setNeedsDisplay() и image.setNeedsLayout в методе setWith(img: UIImage), но я все еще наблюдаю те же результаты.

Вот полный код моего destinationVC

private let image : UIImageView = {
    let img = UIImageView()
    img.translatesAutoresizingMaskIntoConstraints = false
    img.contentMode = .scaleAspectFit
    return img
}()


private lazy var scrollView : UIScrollView! = {
    let scroll = UIScrollView(frame: view.bounds)
    scroll.contentSize = image.bounds.size
    scroll.translatesAutoresizingMaskIntoConstraints = false
    return scroll
}()

func setWith(img: UIImage) {
    self.image.image = img
    image.setNeedsDisplay()
    image.setNeedsLayout()
    updateMinZoomScaleForSize(view.bounds.size)
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.white

    /// Add scrollview
    view.addSubview(scrollView)
    scrollView.addSubview(image)
    scrollView.delegate = self
    addScrollViewConstraints()
    addImageConstraints()
}

private func addScrollViewConstraints() {
    let margins = view.safeAreaLayoutGuide
    scrollView.leftAnchor.constraint(equalTo: margins.leftAnchor).isActive = true
    scrollView.rightAnchor.constraint(equalTo: margins.rightAnchor).isActive = true
    scrollView.topAnchor.constraint(equalTo: margins.topAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: margins.bottomAnchor).isActive = true


}

private func addImageConstraints() {
    image.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    image.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    image.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    image.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true
}

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

private func updateMinZoomScaleForSize(_ size: CGSize) {
    print(image.bounds.width)
    let widthScale = size.width / image.bounds.width
    let heightScale = size.height / image.bounds.height
    let minScale = min(widthScale, heightScale)

    scrollView.minimumZoomScale = minScale
    scrollView.zoomScale = minScale
}

1 Ответ

0 голосов
/ 02 июля 2018

Установка свойства .image для UIImageView не не меняет кадр UIImageView.

Попробуйте изменить функцию setWith() на:

func setWith(img: UIImage) {
    self.image.image = img
    image.frame.size = img.size
    updateMinZoomScaleForSize(view.bounds.size)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...