在 UITableView 中滚动到顶部后,CAGradientLayer 位置错误。迅速

Posted

技术标签:

【中文标题】在 UITableView 中滚动到顶部后,CAGradientLayer 位置错误。迅速【英文标题】:CAGradientLayer has wrong position after scroll to top in UITableView. Swift 【发布时间】:2016-07-12 10:04:42 【问题描述】:

我需要在特定UITableViewCell 的底部制作阴影。我做到了,但是当我滚动到底部时它工作正常,当我滚动到顶部时,阴影的位置错误,它出现在UITableViewCell 的顶部。我尝试了几种方法,但对我不起作用。我读过这个question 和这个question 我该如何解决?

    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
    

我也尝试了以下功能

  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

我也试过了

        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】:

我认为你应该从不能包含阴影的单元格中“移除”阴影。像这样

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

您可以添加屏幕截图“坏”单元格吗?

【讨论】:

你应该删除shadowView吗?例如,为阴影视图使用属性tag 以将其删除。

以上是关于在 UITableView 中滚动到顶部后,CAGradientLayer 位置错误。迅速的主要内容,如果未能解决你的问题,请参考以下文章

将表格滚动到底部后,使用新数据更新 UITableView 的数据源

再次点击当前标签栏时如何在 UITableView 中滚动到顶部?

UITableView 在插入更多行时滚动到顶部

UITableView deleterows 滚动到顶部

将 UITableview 底行滚动到顶部位置

将uitabbar移到顶部后的空白