在 UITableViewCell 中使用时,CAGradientLayer 在 UIView 上溢出

Posted

技术标签:

【中文标题】在 UITableViewCell 中使用时,CAGradientLayer 在 UIView 上溢出【英文标题】:CAGradientLayer overflows on UIView when using in UITableViewCell 【发布时间】:2018-03-30 08:28:46 【问题描述】:

我已将 CAGradientLayer 添加到 UIView 中,该 UITableViewCell 已在其中。这个 UIView 有来自UITableViewCellcontentView 的 20 个trailingleading 空间。但是 UIView 在运行时会溢出。

var gradientLayer: CAGradientLayer!

@IBOutlet weak var view: UIView!

    func createGradientLayer() 
        gradientLayer = CAGradientLayer.init(layer: view.layer)
        gradientLayer.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
        //        gradientLayer.frame = CGRect(x: 0, y: 0, width: self.contentView.frame.size.width, height: )

        let colory: UIColor = UIColor(red: 0, green: 189/255, blue: 237/255, alpha: 1.0)

        gradientLayer.colors = [UIColor.ceruleanBlue.cgColor, colory.cgColor]

        gradientLayer.startPoint = CGPoint.init(x: 0.0, y: 0.5)
        gradientLayer.endPoint = CGPoint(x:1.0,y: 0.5)

//        self.view.layer.mask = gradientLayer
        self.view.layer.insertSublayer(gradientLayer, at: 0)
    

然后在 cellForRow 方法中,我是这样使用的:

if indexPath.row == 0
            let cell = tableView.dequeueReusableCell(withIdentifier: "statisticsCell") as! StatisticsCommentCell

//            cell.frame.size.width = UIScreen.main.bounds.size.width
            cell.view.translatesAutoresizingMaskIntoConstraints = false
            return cell
        

如果我改变了 gradientLayer.frame 如下:

gradientLayer.frame.size.width = self.view.frame.width

gradientView 没有溢出,但似乎只有ceruleanBlue 颜色。

我不知道如何为我的UIView 解决这个问题。

有什么想法吗?提前致谢。

这是一个模拟器的截图,有溢出问题:

提示:通常UIView 已经在UITableViewCellcontentView 的尾随和前导。

另一个问题是当我添加 maskToBounds 时,视图如下所示

UIView 的所有约束

【问题讨论】:

您可以发布您的问题的图片吗? @ReinierMelian 编辑了问题 你有这个视图的宽度限制的IBoutlet吗?你能在故事板上显示这个视图的所有约束的截图吗 在你的视图中添加 maskToBounds = true @ReinierMelian 我刚刚添加了 maskToBounds 但是 UIView 没有渐变了,正常吗? 【参考方案1】:

将您的 gradientLayer 设置为可选,而不是 var gradientLayer: CAGradientLayer! 使用 var gradientLayer: CAGradientLayer? 并将此代码添加到您的 cellLayoutSubViews 方法中

使用此代码

override func layoutSubviews() 
    super.layoutSubviews()
    if(self.gradientLayer == nil)
    self.gradientLayer = CAGradientLayer(layer: self.view.layer)
    //your gradient configuration
    self.layer.addSublayer(self.gradientLayer!)
    
    self.gradientLayer?.drawsAsynchronously = true
    self.gradientLayer?.frame = self.view.bounds

【讨论】:

感谢@ReinlerMelian 的帮助,那是同步绘图的问题吗? 不,是layoutSubviews中的self.gradientLayer?.frame = self.view.bounds

以上是关于在 UITableViewCell 中使用时,CAGradientLayer 在 UIView 上溢出的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableViewCell 中添加 UICollectionView 时出错

使用 lineHeightMultiple 控制行间行距时,如何在 UITableViewCell 中垂直对齐我的 UILabel?

如何在自动布局中使用 UITableViewCell 的动态高度并在底部视图隐藏时将其他视图向上移动?

在 UITableviewCell 中使用 UICollection 视图时未调用 UICollectionView 委托方法“didSelectItemAtIndexPath”

使用缩放在 UITableViewCell 中缩放 UIImageView

使用发件人标签在 UIbutton 单击事件时更新 UITableViewCell 的标签