代码之家  ›  专栏  ›  技术社区  ›  Emre Önder

UIScrollView上的“CALayer位置包含NaN:[NaN NaN]”

  •  0
  • Emre Önder  · 技术社区  · 7 年前

    我正在开发一个只有一个屏幕的屏幕 UIImageView 在…内 UIScrollView . UIScrollView 使用户能够固定和缩放图像。我从下面的帖子得到了帮助。它使用故事板和自动布局。基本上,它有8个约束,即顶部、底部、前导和尾部(scrollview到superview和imageView到scrollview)。示例帖子在故事板内设置图像,这样就不需要给出任何特定的高度或宽度。

    https://www.raywenderlich.com/560-uiscrollview-tutorial-getting-started

    我的问题是,当我使用相同的代码,但以编程方式执行所有操作时,我可以看到图像(这是额外的缩放),我可以用一个手指滚动,但当我想捏它(缩小,放大)时,我得到了

    错误我认为这是因为scrollview没有设置contentSize或contentOffset,但无论我设置了哪些属性,都会出现相同的错误。

     override func viewDidLoad() {
    
        self.scrollView.delegate = self
        self.scrollView.translatesAutoresizingMaskIntoConstraints = false
        self.imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.image = photo
        imageView.contentMode = .scaleAspectFit
        scrollView.addSubview(imageView)
        self.view.addSubview(scrollView)
        self.imageView.setContentHuggingPriority(UILayoutPriority.init(251), for: NSLayoutConstraint.Axis.vertical)
        self.imageView.setContentHuggingPriority(UILayoutPriority.init(251), for: NSLayoutConstraint.Axis.horizontal)
    
        scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    
        imageViewTopConstraint = imageView.topAnchor.constraint(equalTo: self.scrollView.topAnchor, constant: 0)
        imageViewTopConstraint.isActive = true
    
        imageViewBottomConstraint = imageView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor, constant: 0)
        imageViewBottomConstraint.isActive = true
    
        imageViewLeadingConstraint = imageView.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor, constant: 0)
        imageViewLeadingConstraint.isActive = true
    
        imageViewTrailingConstraint = imageView.trailingAnchor.constraint(equalTo: self.scrollView.trailingAnchor, constant: 0)
        imageViewTrailingConstraint.isActive = true
    
        scrollView.contentSize = imageView.bounds.size
    
    }
    
    fileprivate func updateMinZoomScaleForSize(_ size: CGSize) {
        let widthScale = size.width / imageView.bounds.width
        let heightScale = size.height / imageView.bounds.height
        let minScale = min(widthScale, heightScale)
    
        scrollView.minimumZoomScale = minScale
    
        scrollView.zoomScale = minScale
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
    
        updateMinZoomScaleForSize(view.bounds.size)
    }
    
    fileprivate func updateConstraintsForSize(_ size: CGSize) {
    
        let yOffset = max(0, (size.height - imageView.frame.height) / 2)
        imageViewTopConstraint.constant = yOffset
        imageViewBottomConstraint.constant = yOffset
    
        let xOffset = max(0, (size.width - imageView.frame.width) / 2)
        imageViewLeadingConstraint.constant = xOffset
        imageViewTrailingConstraint.constant = xOffset
    
        view.layoutIfNeeded()
    }
    
    }
    
    extension ZoomedPhotoViewController: UIScrollViewDelegate {
    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    
    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        updateConstraintsForSize(view.bounds.size)
    }
    
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Emre Önder    7 年前

    我通过移动使它工作 updateMinZoomScaleForSize(view.bounds.size) 作用于 ViewDidLayoutSubViews() ViewDidLoad() 打电话 self.view.layoutIfNeeded() 在调用ZoomScale函数之前。因此,我的最终目标是工作 ViewDidLoad()

        override func viewDidLoad() {
        super.viewDidLoad()
        self.scrollView.delegate = self
        self.scrollView.translatesAutoresizingMaskIntoConstraints = false
        self.imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.image = photo
        imageView.contentMode = .scaleAspectFit
        imageView.clipsToBounds = true
        scrollView.addSubview(imageView)
        //scrollView.contentSize = CGSize(width: imageView.image!.size.width, height: imageView.image!.size.height)
        self.view.addSubview(scrollView)
        self.imageView.setContentHuggingPriority(UILayoutPriority.init(251), for: NSLayoutConstraint.Axis.vertical)
       self.imageView.setContentHuggingPriority(UILayoutPriority.init(251), for: NSLayoutConstraint.Axis.horizontal)
    
        scrollView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
        scrollView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true
    
        imageViewTopConstraint = imageView.topAnchor.constraint(equalTo: self.scrollView.topAnchor, constant: 0)
        imageViewTopConstraint.isActive = true
    
        imageViewBottomConstraint = imageView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor, constant: 0)
        imageViewBottomConstraint.isActive = true
    
        imageViewLeadingConstraint = imageView.leadingAnchor.constraint(equalTo: self.scrollView.leadingAnchor, constant: 0)
        imageViewLeadingConstraint.isActive = true
    
        imageViewTrailingConstraint = imageView.trailingAnchor.constraint(equalTo: self.scrollView.trailingAnchor, constant: 0)
        imageViewTrailingConstraint.isActive = true
    
    
        self.view.layoutIfNeeded()
        updateMinZoomScaleForSize(view.bounds.size)
    
    }