在具有多个部分的 tableView 中滚动时使用平滑动画更改视图背景渐变颜色

Posted

技术标签:

【中文标题】在具有多个部分的 tableView 中滚动时使用平滑动画更改视图背景渐变颜色【英文标题】:Change view background gradient color with smooth animation while scrolling in tableView with multiple section 【发布时间】:2018-01-25 05:34:56 【问题描述】:

我的 UITableView 中有多个部分,我想更改我的视图 背景颜色作为渐变颜色,平滑过渡,同时 滚动表视图。

当新部分出现在 tableView 中时,更改视图背景颜色 顺利。

我怎样才能实现这种动画?

我的代码在下面,用于更改背景颜色但不流畅

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
        switch section 
        case 0:
                self.view.backgroundColor = UIColor.cyan
            break
        case 1:
               self.view.backgroundColor = UIColor.red
            break
        case 2:
               self.view.backgroundColor = UIColor.green
            break
        case 3:
               self.view.backgroundColor = UIColor.blue
            break
        case 4:
               self.view.backgroundColor = UIColor.brown
            break
        default:
              self.view.backgroundColor = UIColor.brown
            break
        
    

【问题讨论】:

请附上您当前的代码、截图。这个问题好像不清楚 我不确定。尝试在动画块中添加这种颜色变化并将动画块中的 alpha 更改为 0.5 到 1。这应该会给你那种效果。如果没有,您可以在这里使用图层。 是的,但是当我添加动画块时,它工作不顺利 【参考方案1】:

您可以尝试使用此代码。

func tableView(_ tableView: UITableView, willDisplayHeaderView view: 
UIView, forSection section: Int) 

    switch section 
    case 0:
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseIn, .curveEaseOut, .allowUserInteraction], animations: () -> Void in
            self.view.backgroundColor = UIColor.cyan.withAlphaComponent(0.4)

        )

    case 1:
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseIn, .curveEaseOut, .allowUserInteraction], animations: () -> Void in
            self.view.backgroundColor = UIColor.green.withAlphaComponent(0.4)

        )

    case 2:
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseIn, .curveEaseOut, .allowUserInteraction], animations: () -> Void in
            self.view.backgroundColor = UIColor.yellow.withAlphaComponent(0.4)

        )

    case 3:
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseIn, .curveEaseOut, .allowUserInteraction], animations: () -> Void in
            self.view.backgroundColor = UIColor.orange.withAlphaComponent(0.4)

        )

    case 4:
        UIView.animate(withDuration: 0.5, delay: 0.0, options: [.curveEaseIn, .curveEaseOut, .allowUserInteraction], animations: () -> Void in
            self.view.backgroundColor = UIColor.magenta.withAlphaComponent(0.4)

        )

    default:
        self.view.backgroundColor = UIColor.brown

    

【讨论】:

如何在所有部分设置渐变色而不是简单的 UIColor ? 可以使用单个函数以更优化的方式编写代码,而不是重复动画代码,这里可以应用代码重构。 @vaibhav 是的,可以写成更优化的方式。但我不是来优化代码的。 好的,我们在这里的目的是为操作提供更好的答案。 您所说的解决方案只会删除重复的代码。它不会改变代码的复杂性。因此,如果您不删除它,那么它也可以正常工作。【参考方案2】:

您可以使用此代码平滑地更改视图渐变颜色 -

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) 
    for layer in self.view.layer.sublayers! 
        if layer .isKind(of: CAGradientLayer.self) 
            layer.removeFromSuperlayer()
        
    
    let gradient = CAGradientLayer()
    gradient.frame = self.view.bounds
    gradient.colors = [self.generateRandomColor().cgColor, self.generateRandomColor().cgColor]
    let anim:CABasicAnimation = CABasicAnimation.init(keyPath: "opacity")
    anim.fromValue = 0.5
    anim.toValue = 1
    anim.duration = 1.0
    gradient.add(anim, forKey: "opacity")
    self.view.layer.addSublayer(gradient)
    self.view.layoutIfNeeded()


func generateRandomColor() -> UIColor 
    let hue : CGFloat = CGFloat(arc4random() % 256) / 256 + 0.5
    let saturation : CGFloat = CGFloat(arc4random() % 128) / 256 + 0.5
    let brightness : CGFloat = CGFloat(arc4random() % 128) / 256 + 0.5
    return UIColor(hue: hue, saturation: saturation, brightness: brightness, alpha: 0.5)

【讨论】:

是的,这很好,但是如何设置渐变颜色而不是 UICoor 你需要添加渐变层。为此

以上是关于在具有多个部分的 tableView 中滚动时使用平滑动画更改视图背景渐变颜色的主要内容,如果未能解决你的问题,请参考以下文章

UIButton状态在用多个部分滚动tableview时改变 - Swift

如何同时滚动多个tableview

tableView 单元格内的多个 collectionView 单元格在滚动时更改设计

iOS - 具有多个 UITableViews 的水平 UIScrollView

每次我重新加载 tableview 部分时 UITableView 都不会向上滚动

iOS:TableView 滚动到部分