菜鸟教程小白 发表于 2022-12-11 19:21:07

ios - 将水平和垂直 CAGradientLayer 蒙版应用到 UIScrollView/UICollectionView


                                            <p><p>我有一个可以在 X 轴和 Y 轴上滚动的 UICollectionView,我想通过在任何具有可滚动内容的方向上添加一点淡入淡出来应用一个很酷的 UI 效果。假设情况下,页面可以同时显示所有四个带有淡入淡出的边缘,或者根本不显示,具体取决于具体情况。</p>

<p>我目前已经实现了一个 CAGradientLayer,它可以为页面的顶部或底部(垂直/y 轴)添加透明度,但我不知道如何添加第二个,以实现额外的左右淡入淡出。 </p>

<pre><code>@IBOutlet var collectionView: UICollectionView!
let fadeOffset: CGFloat = 10

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    if self.collectionView.layer.mask == nil {

      let maskLayer = CAGradientLayer()
      maskLayer.locations =
            [
                NSNumber(value: 0.0),
                NSNumber(value: 0.2),
                NSNumber(value: 0.8),
                NSNumber(value: 1.0)
            ]

      let bounds = CGRect(origin: CGPoint.zero,
                                 size: self.collectionView.frame.size)
      maskLayer.bounds = bounds
      maskLayer.anchorPoint = CGPoint.zero

      self.collectionView.layer.mask = maskLayer
    }

    self.scrollViewDidScroll(self.collectionView)
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView == self.collectionView {

      let outerColor = UIColor(white: 1, alpha: 0).cgColor
      let innerColor = UIColor(white: 1, alpha: 1).cgColor
      var colors: = []

      let x = scrollView.contentOffset.x
      let y = scrollView.contentOffset.y

      // CALCULATE TOP FADE
      colors += [y + scrollView.contentInset.top &lt;= self.fadeOffset ?
            innerColor : outerColor]
      colors +=

      // CALCULATE BOTTOM FADE
      colors +=
      colors += [y + scrollView.frame.height &gt;= scrollView.contentSize.height - self.fadeOffset ?
            innerColor : outerColor]

      // APPLY MASK COLORS
      if let mask = scrollView.layer.mask as? CAGradientLayer {
            mask.colors = colors

            CATransaction.begin()

            CATransaction.setDisableActions(true)
            mask.position = CGPoint(x, y)

            CATransaction.commit()
      }
    }
}
</code></pre>

<p>是否可以为水平轴添加另一个 CAGradientLayer?或者也许有更简单/更好的方法?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>看起来您要的是双线性渐变。查看 <a href="https://github.com/maxkonovalov/MKGradientView" rel="noreferrer noopener nofollow">MKGradientView</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 将水平和垂直 CAGradientLayer 蒙版应用到 UIScrollView/UICollectionView,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/43028120/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/43028120/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 将水平和垂直 CAGradientLayer 蒙版应用到 UIScrollView/UICollectionView