Ios UILabel圆角将剪切文本

Ios UILabel圆角将剪切文本,ios,swift,Ios,Swift,我使用的是自定义TableCell,其标签为numberofLines=0 我想要这样的标签 if indexPath.row % 2 != 0 { cell.cellTypeToDraw = .cellTypeReceiver } else { cell.cellTypeToDraw = .cellTypeSender } 为了实现这一点,我在cell的swift文件中编写了这样的代码。我基本

我使用的是自定义TableCell,其标签为numberofLines=0

我想要这样的标签

 if indexPath.row % 2 != 0 {
            cell.cellTypeToDraw = .cellTypeReceiver
        }
        else {
            cell.cellTypeToDraw = .cellTypeSender
        }

为了实现这一点,我在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)
但问题是当标签的内容大于单元格的行高时,它不会显示内容

请在第一张图片中查看第二个单元格的标签。它的内容不显示。 但是,当我删除圆角的代码时,一切正常,但丢失了圆角半径

非常感谢您的建议。谢谢

编辑:

var cellTypeToDraw:cellType {
    get {
        return self.cellTypeToDraw
    }
    // ...
}
我的手机是这样的

 if indexPath.row % 2 != 0 {
            cell.cellTypeToDraw = .cellTypeReceiver
        }
        else {
            cell.cellTypeToDraw = .cellTypeSender
        }

我正在使用下面的代码实现聊天界面

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
        }

添加视图插入标签并在标签和该视图之间添加一些空间

你做得太早了。 您可以将
单元格类型设置为Draw
,从而在布局尚未完成时调用
圆角(拐角:,半径:)
方法。在
cellForRow(at:)
中,您会看到一个回收的单元格,其
chatlab
的框架仍与先前显示的文本相匹配

一个快速修复方法是将此角舍入移动到单元格的
layoutSubviews()
方法。比如:

override func layoutSubviews() {
    super.layoutSubviews()
    chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)
}
(如果只希望某些单元格类型具有圆角,也可以在此处检查
单元格类型ToDraw
。)


顺便说一下:

提示1: 你不应该做那样的事:

var cellTypeToDraw:cellType {
    get {
        return self.cellTypeToDraw
    }
    // ...
}
当你试图调用
cellTypeToDraw
并最终导致应用程序崩溃时,这将导致无休止的递归。通过实现getter和setter,可以定义不受实例变量支持的计算属性
self.cellTypeToDraw
没有值。它只是再次调用getter,再次返回
self.cellTypeToDraw
,以此类推

解决方案:不要使用计算属性,而是使用由实例变量支持的“常规”属性,并在属性的观察者中执行所有单元格设置:

var cellTypeToDraw:cellType {
    didSet {
        // configure your cell here
    }
}
提示2:
您可以(也应该)省略Swift中的所有
self.
前缀,以提高可读性和减少工作量。

我知道有一个
UITableViewCell
,如果是,那么您是否实施了必要的约束,使其根据内部文本增长?是的。我已经提到它是tableCell。你需要在UILabel中添加边距,如果有帮助,你可以在这个库中使用圆角方法:。这是旧的ObjC代码。请尝试在角落无线电掩蔽之前添加文本。我不明白。我的标签与图像保持8像素不变。答案已编辑。图像到标签的距离没有问题。问题是你们需要在标签上加一些填充物。并添加圆角以查看。感谢您的回答。它工作得非常好。但是,didSet不起作用。willSet正在这里工作。
didSet
如果使用属性的名称而不是
newValue
,也会工作。