Swift:在tableview的单元格上的渐变

时间:2014-08-28 19:30:54

标签: ios swift tableview gradient cagradientlayer

在tableView的单元格中,我正在尝试使用以下Swift代码定义渐变:

func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {

    var cell:UITableViewCell = self.tableView?.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
    cell.backgroundColor=UIColor.clearColor()
    let gradient : CAGradientLayer = CAGradientLayer()
    var arrayColors:Array<AnyObject> = [UIColor.blackColor().CGColor, UIColor.whiteColor().CGColor]
    gradient.colors=arrayColors
    gradient.frame = cell.bounds
    cell.layer.insertSublayer(gradient, atIndex: UInt32(indexPath.row))

    return cell
 }

行为非常混乱:首次加载视图时,所有单元格都具有白色背景。如果我上下滚动,一些内容的单元格会消失(标题和副标题),渐变最终会出现在这些单元格中(随机,其他一些单元格保留白色背景)。 它与此演员表有关 - &gt; UInt32(indexPath.row)?

3 个答案:

答案 0 :(得分:1)

渐变是视觉装饰。它特定于细胞类。细胞的外观是细胞的责任。它应该在细胞类中定义。它绝对不属于cellForRowAtIndexPath,它应该仅仅是为右行选择正确的单元格。 但是,您正在使用该方法配置单元格的内部结构,并结合排队的工作方式,会导致所有问题。

1)创建一个UITableViewCell的子类(以编程方式,IB ..这并不重要)

2)将awakeFromNib或layoutSubviews中的图层添加到backroundView属性。

3)在tableViewController中的viewDidLoad中注册单元格。

答案 1 :(得分:0)

我有类似的问题,我的错误是直接在单元格中插入带有渐变的新图层,尝试将新图层插入到这样的backgroundView

let gradient = CAGradientLayer()
// layer setup...
cell.backgroundView = UIView()
cell.backgroundView?.layer.insertSublayer(gradientLayer, atIndex: 0)

希望这有帮助。

答案 2 :(得分:0)

  

进一步扩展伯爵夫人格雷和hidra答案

在将渐变添加到特定视图时,需要设置渐变层的实际帧。

如果在视图上最初添加了渐变图层的视图确实已加载,那么您必须将其放入,然后它将无法按预期调整大小,可以通过两种方法解决此问题。

  

第一:            通过计算视图的大小手动给定帧,但这非常麻烦,因为您必须为每个iPhone变型计算,才能计算出宽高比BY。

 let bounds = UIScreen.main.bounds
 let deviceheight = bounds.size.height
 let deviceWidth = bounds.size.width

然后您计算并给出宽度大小

  

另一种方法是不执行任何计算即可,只需在加载视图后添加图层即可,这可以通过以下方式完成:

 override func viewDidAppear(_ animated: Bool) {
    Your gradient code //you can create a method for adding a gradient layer 
}
  

现在在Tableview或collection视图中,存在相同的问题,并且在单元格中没有任何视图确实出现过方法。我们有两种情况。

     
      
  1. 数据是静态的。
  2.   
  3. 数据来自服务器
  4.   

在第一种情况下,当数据是静态的时,您都必须创建一个布尔类型的变量并将其设置为false,直到加载视图为止。然后在视图中确实在索引方法中出现了用于行的方法,然后再次重新加载单元格。

class VC: UIViewController {


var isCellLoaded : Bool = false

override func viewDidAppear(_ animated: Bool) {

    isCellLoaded = true
    self.aTable.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



    let cell = tableView.dequeueReusableCell(withIdentifier: "youcellidentifier", for: indexPath) as! youcell 
    if isCellLoaded {
        cell.gradientView.setGradient(cornerRadius: 5, gradientLeftColor: .notificationViewLeftColor, gradientRightColor: .notificationViewRightColor)
        if let gradient = cell.gradientView.layer.sublayers?[0] as? CAGradientLayer {
            gradient.frame = cell.gradientView.bounds
        }
    }

    return cell
}
  

当数据来自API时进入第二种情况

     

万岁!您不需要做任何事情,因为第一次,直到直到api没有给出任何响应的数据为止,当响应到来时,您必须重新加载数据。一切都会正常进行。   引用