ios - 将水平和垂直 CAGradientLayer Mask 应用于 UIScrollView/UICollectionView

标签 ios swift uiscrollview cagradientlayer

我有一个可以在 X 轴和 Y 轴上滚动的 UICollectionView,我想通过向具有可滚动内容的任何方向添加一点淡入淡出来应用酷炫的 UI 效果。假设页面可以同时显示所有四个渐变边缘,或者根据情况完全不显示。

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

@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: [CGColor] = []

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

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

        // CALCULATE BOTTOM FADE
        colors += [innerColor]
        colors += [y + scrollView.frame.height >= 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()
        }
    }
}

是否可以为水平轴添加另一个 CAGradientLayer?或者也许有更简单/更好的方法?

最佳答案

看起来您要求的是双线性渐变。查看MKGradientView

关于ios - 将水平和垂直 CAGradientLayer Mask 应用于 UIScrollView/UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43028120/

相关文章:

ios - 返回上一个 View 不起作用

ios - 需要苹果团队帮助查找崩溃点、崩溃日志

swift - 无法安装应用程序

ios - 新的 iOS 11 ScrollView contentLayoutGuide 不工作

ios - 缩放弹跳 + 导航栏后退按钮点击 = 应用程序崩溃

ios - 在 ScrollView : touchesBegan is received, 上拖动 View 但没有 touchesEnded 或 touchesCancelled

ios - iOS 中的 Unicode 文件名

iphone - 应用程序动态选择要使用的图标/图像

ios - 为什么我不能设置 SKScene(fileNamed :) in GameViewController?

iOS – 在 Swift 中处理 OTP(一次性代码)