CAGradientLayer has wrong position after scroll to

2019-09-09 22:04发布

问题:

I need to make a shadow on the bottom on the specific UITableViewCell. I made it but when I scroll to bottom it works fine, when I scroll to top the shadow has wrong position and it appears on the top of UITableViewCell. I tried several methods but it doesn't work for me. I read this question and this question How can I fix it?

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(cellReuseIdentifier, forIndexPath: indexPath) as! LifelineLeaderboardTableViewCell

        // Configure the cell...
        let lifelineRecentModel = users[indexPath.row]

        cell.clipsToBounds = false
        if let currentUserID = DBHelper.instance.mainUserId {
            if lifelineRecentModel.user.id == currentUserID {
                cell.setupUserNumberLabelTextColor(true)
                cell.showBlueLineView(true)
//                cell.showShadow(true)
                let shadowView = UIView(frame: cell.bounds)

                let shadowFrame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: cell.bounds.width, height: 90))
                let shadowPath = UIBezierPath(rect: shadowFrame).CGPath
                let shadow = CAGradientLayer()

                shadow.shadowOpacity = 0.25
                shadow.shadowColor = UIColor.blackColor().CGColor
                shadow.shadowPath = shadowPath
                shadowView.layer.insertSublayer(shadow, atIndex: 0)
                cell.contentView.addSubview(shadowView)
            } else {
                cell.setupUserNumberLabelTextColor(false)
                cell.showBlueLineView(false)
//                cell.showShadow(false)
            }
        } else {
            cell.setupUserNumberLabelTextColor(false)
            cell.showBlueLineView(false)
//            cell.showShadow(false)
        } 

        return cell
    }

Also I tried my following function

  func showShadow(bool: Bool) {
    let shadowFrame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: bounds.width, height: bounds.height + 10))
    let shadowPath = UIBezierPath(rect: shadowFrame).CGPath

    layer.shadowOpacity = 0.25
    layer.shadowColor = UIColor.blackColor().CGColor
    layer.shadowPath = shadowPath
    clipsToBounds = !bool
}

Also I tried it

        cell.clipsToBounds = false
        if let currentUserID = DBHelper.instance.mainUserId {
            if lifelineRecentModel.user.id == currentUserID {
                cell.setupUserNumberLabelTextColor(true)
                cell.showBlueLineView(true)
//                cell.showShadow(true)
                cell.layer.shadowPath = UIBezierPath(rect: cell.bounds).CGPath
                cell.layer.shadowOpacity = 0.5
                cell.layer.shadowOffset = CGSize(width: 0, height: 10)

            } else {
                cell.setupUserNumberLabelTextColor(false)
                cell.showBlueLineView(false)
//                cell.showShadow(false)
                cell.layer.shadowOpacity = 0

            }
        } else {
            cell.setupUserNumberLabelTextColor(false)
            cell.showBlueLineView(false)
//            cell.showShadow(false)
            cell.layer.shadowOpacity = 0
        }

回答1:

I think you should "remove" shadow from cells which mustn't contain shadow. Like this

if let currentUserID = DBHelper.instance.mainUserId {
  ..........
} else { 
   .......
   shadow.shadowColor = UIColor.clearColor().CGColor
}

Can you add screenshots 'bad' cells?