我正在使用自定义TableCell,它有一个numberofLines=0的标签
我想要这样的标签。
ios - UILabel圆角切除文字-LMLPHP
只在三个角上四舍五入。为了实现这个目标,我在cell的swift文件中编写了这样的代码。我基本上扩展了UIView。

extension UIView {
    func roundCorners(corners:UIRectCorner, radius: CGFloat) {
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    }
}

我用这种方式来绕过我的角落。
self.chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)

但问题是当标签的内容大于单元格的行高时,它不会显示内容
请在第一张图片中看到第二个单元格的标签。它的内容没有显示出来。
但当我删除圆角的代码时,一切都正常,但失去了圆角半径。
ios - UILabel圆角切除文字-LMLPHP
如有任何建议,我们将不胜感激。谢谢。
编辑:
我的手机是这样的。
ios - UILabel圆角切除文字-LMLPHP
我正在使用下面的代码实现聊天界面。
var cellTypeToDraw:cellType {
        get {
            return self.cellTypeToDraw
        }
        set(newValue) {
            switch newValue {
            case .cellTypeReceiver:
                self.leftImage.isHidden = true
                 self.rightImage.isHidden = false
                self.chatLabel.textAlignment = .right
                self.chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)
            case .cellTypeSender:
                self.rightImage.isHidden = true
                self.leftImage.isHidden = false
                self.chatLabel.textAlignment = .left
                self.chatLabel.roundCorners(corners: [.topRight,.bottomLeft,.bottomRight], radius: 7.0)
            }
            self.leftImage.layer.cornerRadius = self.leftImage.bounds.size.width/2
            self.rightImage.layer.cornerRadius = self.rightImage.bounds.size.width/2
           // self.chatLabel.sizeToFit()
           // self.chatLabel.autoresizingMask = .flexibleHeight
        }
    }

在cellForRowAtIndexPath中访问这个变量。
 if indexPath.row % 2 != 0 {
            cell.cellTypeToDraw = .cellTypeReceiver
        }
        else {
            cell.cellTypeToDraw = .cellTypeSender
        }

最佳答案

你这么做太早了。
设置cellTypeToDraw并在布局尚未完成时调用roundCorners(corners:, radius:)方法。在cellForRow(at:)中,您将得到一个循环使用的单元格,其chatLabel仍具有与先前显示的文本匹配的帧。
一个快速的解决方法是将这个角点舍入到单元格的layoutSubviews()方法。类似于:

override func layoutSubviews() {
    super.layoutSubviews()
    chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)
}

(如果您只想对某些单元格类型使用圆角,也可以检查那里的cellTypeToDraw。)
顺便说一句:
提示1:
你不应该这样做:
var cellTypeToDraw:cellType {
    get {
        return self.cellTypeToDraw
    }
    // ...
}

当您试图调用cellTypeToDraw并最终导致应用程序崩溃时,这将导致无休止的递归。通过实现getter和setter,可以定义不受实例变量支持的计算属性。self.cellTypeToDraw没有值。它只需再次调用getter,然后再次返回self.cellTypeToDraw,依此类推。
解决方案:不要使用computed属性,而使用“regular”属性,该属性由实例变量支持,并在属性的observer中进行所有单元格设置:
var cellTypeToDraw:cellType {
    didSet {
        // configure your cell here
    }
}

提示2:
您可以(而且应该)在Swift中省略所有的self.前缀,以获得更好的可读性和更少的工作量。

10-08 08:59