Parallax effect with UIScrollView subviews

后端 未结 2 2002
北恋
北恋 2020-12-14 04:04

I\'m trying to create a Parallax effect on a UIView inside a UIScrollView. The effect seems to work, but not so well.

  1. First i add two UIView sub-views to a UI
2条回答
  •  别那么骄傲
    2020-12-14 04:57

    Scaling Factor being the key element...

    ...let me offer a 1:1 calculation:

    Assuming 2 UIScrollView, one in the foreground and on in the rear, assuming the foreground controls the rear, and further assuming that a full width in the foreground corresponds to a full width in the background, you then need to apply the fore ratio, not the fore offset.

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let foreSpan = foreScrolView.bounds.width - foreScrolView.contentSize.width
        let foreRatio = scrollView.contentOffset.x / foreSpan
        let rearSpan = rearScrollView.bounds.width - rearScrollView.contentSize.width
        rearScrollView.setContentOffset(
            CGPoint(x: foreRatio * rearSpan, y: 0),
            animated: false)
    }
    

    Final effect

    The two scrollers, fore and rear, each contain a UIImageView displayed at its full width:

    let foreImg = UIImageView.init(image: UIImage(named: "fore"))
    foreImg.frame = CGRect(x: 0, y: 0,
                           width: foreImg.frame.width,
                           height: foreScrolView.bounds.height)
    foreScrolView.contentSize = foreImg.frame.size
    foreScrolView.addSubview(foreImg)
    
    let rearImg = UIImageView.init(image: UIImage(named: "rear"))
    rearImg.frame = CGRect(x: 0, y: 0,
                           width: rearImg.frame.width,
                           height: rearScrollView.bounds.height)
    rearScrollView.contentSize = rearImg.frame.size
    rearScrollView.addSubview(rearImg)
    

    This will scroll both images at a different speed, covering each image in full from edge to edge.


    ► Find this solution on GitHub and additional details on Swift Recipes.

提交回复
热议问题