Мое приложение падает с этим сообщением:
'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. Я пытался вызвать эту функцию в нескольких других местах:
viewDidLayoutSubviews
- по-прежнему вылетает
viewWillLayoutSubviews
- по-прежнему вылетает
viewWillAppear
- все еще падает
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
}