首次在Swift中的UICollectionView中加载时,视差效果略微不稳定

时间:2016-09-06 17:34:49

标签: ios swift uicollectionview parallax

我正在为我的UICollectionView实现视差效果。谢天谢地,效果很好。但是,当我第一次垂直滚动集合时,会出现波涛汹涌的效果。这仅在列表的第一次滚动时发生。之后,滚动时视差效果平滑。

以下是我的相关代码:

MyViewController.swift:

extension FeedViewController: UIScrollViewDelegate{
    func scrollViewDidScroll(scrollView: UIScrollView) {
        // Scroll navigation bar animation
        let scrolledDown = scrollView.contentOffset.y > -self.topLayoutGuide.length
        let newAlpha:CGFloat = scrolledDown ? 0.65 : 0.00

        UIView.animateWithDuration(0.25) {
            self.navBarBackground.alpha = newAlpha
        }

        // Parallax effect
        for cell in collectionView.visibleCells() {
            updateParallaxCell(cell)
        }
    }

    func updateParallaxCell(cell: UICollectionViewCell) {
        if let myCell = cell as? MyCustomCell {
            myCell.updateParallaxEffect(collectionView, mainView: view)
        }
    }
}

MyCustomCell.swift

override func awakeFromNib() {
        super.awakeFromNib()
        backgroundImageOriginalOrigin = backgroundImage.frame.origin
    }

    func updateParallaxEffect(collectionView: UICollectionView, mainView view: UIView) {
        let convertedRect = collectionView.convertRect(self.frame, toView: view)  //frame of the cell within the coordinate system of the main view
        let distanceFromCenter = CGRectGetHeight(self.frame) / 2 - CGRectGetMinY(convertedRect)  //y coordinate distance of the cell from the center of the main view
        let difference : CGFloat = 50.0  //maximum relative offset of the image within the cell
        let move = -difference / 4 + (distanceFromCenter / self.frame.size.height) * difference  // calculated relative offset of the image

        let y = self.backgroundImageOriginalOrigin.y + move // newly calculated Y coordinate of the image
        self.backgroundImage.frame.origin = CGPointMake(self.backgroundImageOriginalOrigin.x, y) // adjusting the image view frame
    }

    override func layoutSubviews() {

        updateParallaxEffect(collectionView, mainView: mainView)
        super.layoutSubviews()
    }

任何人都可以看到它的错误吗?

1 个答案:

答案 0 :(得分:0)

尝试将此添加到您的viewDidLoad()

UICollectionView().setContentOffset(CGPointMake(0, 1), animated: true)
UICollectionView().setContentOffset(CGPointMake(0, 0), animated: false)