Shadow rate on UITableViewCell contenview increasing while scrolling

时间:2017-12-08 05:18:53

标签: ios swift uitableview swift4

In my app, I'm using dynamic height cells using auto layout. So for creating cardview effect I've to use tableview willdisplaycell method. It only add shadow only once to cell. But I don't know why shadow increasing while scrolling.

Here's my code

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        //setup card view style on cell
        if !cellArray.contains(indexPath.row) {
            cell.contentView.backgroundColor = UIColor.clear
            let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5.0, y: 5.0, width: cell.contentView.frame.size.width-10, height: cell.contentView.frame.size.height-10))
            whiteRoundedView.layer.backgroundColor = UIColor.white.cgColor
            whiteRoundedView.layer.masksToBounds = false
            whiteRoundedView.layer.cornerRadius = 5.0
            whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
            whiteRoundedView.layer.shadowOpacity = 0.5
            cell.contentView.addSubview(whiteRoundedView)
            cell.contentView.sendSubview(toBack: whiteRoundedView)
            cellArray.add(indexPath.row)
        }
    }

2 个答案:

答案 0 :(得分:2)

这条线是引起问题的。

  

cell.contentView.addSubview(whiteRoundedView)

每当调用 willDisplayCell 时,您将每次都添加视图。这就是在滚动时阴影增加的原因。解决方案是,

1. check the cell content view if the view is already added or not. If not, then add the view. use view tag to do it.

2. otherwise, create a shadow view and initialize the specific things in the -(void)awakeFromNib, which will get called only once.

但就个人而言,我更喜欢选项2,它会将视图渲染逻辑与视图控制器或单元格隔离开来。

将以下代码添加到自定义单元格类中。在这种情况下,我已经给出了15-15-15-15的前导 - 顶部 - 底部约束。如果您希望可以将其设置为0.但请确保它应与背景约束同步。

override func awakeFromNib() {
    super.awakeFromNib()
    contentView.backgroundColor = UIColor.clear
    let whiteRoundedView : UIView = UIView(frame: CGRect(x: 5.0, y: 5.0, width: contentView.frame.size.width-10, height: contentView.frame.size.height-10))
    whiteRoundedView.layer.backgroundColor = UIColor.white.cgColor
    whiteRoundedView.layer.masksToBounds = false
    whiteRoundedView.layer.cornerRadius = 5.0
    whiteRoundedView.layer.shadowOffset = CGSize(width: -1, height: 1)
    whiteRoundedView.layer.shadowOpacity = 0.5
    whiteRoundedView.tag = shadowTag
    whiteRoundedView.translatesAutoresizingMaskIntoConstraints=false
    contentView.addSubview(whiteRoundedView)
    contentView.sendSubview(toBack: whiteRoundedView)
    let leading = NSLayoutConstraint(item: whiteRoundedView,
                                     attribute: .leading,
                                     relatedBy: .equal,
                                     toItem: contentView,
                                     attribute: .leading,
                                     multiplier: 1.0,
                                     constant: 15.0)
    let trailing = NSLayoutConstraint(item: whiteRoundedView,
                                      attribute: .trailing,
                                      relatedBy: .equal,
                                      toItem: contentView,
                                      attribute: .trailing,
                                      multiplier: 1.0,
                                      constant: -15.0)

    let top = NSLayoutConstraint(item: whiteRoundedView,
                                 attribute: .top,
                                 relatedBy: .equal,
                                 toItem: contentView,
                                 attribute: .top,
                                 multiplier: 1.0,
                                 constant: 15.0)

    let bottom = NSLayoutConstraint(item: whiteRoundedView,
                                    attribute: .bottom,
                                    relatedBy: .equal,
                                    toItem: contentView,
                                    attribute: .bottom,
                                    multiplier: 1.0,
                                    constant: -15.0)

    contentView.addConstraint(leading)
    contentView.addConstraint(trailing)
    contentView.addConstraint(top)
    contentView.addConstraint(bottom)
}

参考屏幕截图: enter image description here

答案 1 :(得分:0)

您可以在此处添加代码

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

    var cell = tableView.dequeueReusableCell(withIdentifier: <idenitfier>, for: indexPath) as? JobListTableViewCell

    if cell == nil {

        //Initialization and setting of shadow

    }
    return cell 
}

希望这有帮助