UILabel圆角切断文字

时间:2017-06-06 06:50:55

标签: ios swift

我正在使用自定义TableCell,其标签为 numberofLines = 0

我想要这样的标签。

enter image description here

这只是在三个角落四舍五入。为了实现我在单元格的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)

但问题是当标签的内容大于单元格的行高时,它没有显示内容

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

enter image description here

任何建议都非常感谢。谢谢。

编辑:

我的手机就像这样。

enter image description here

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

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
        }

2 个答案:

答案 0 :(得分:1)

你做得太早了。

您设置了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,依此类推。

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

var cellTypeToDraw:cellType {
    didSet {
        // configure your cell here
    }
}

提示2:

您可以(并且应该)省略Swift中的所有self.前缀,以提高可读性并减少工作量。

答案 1 :(得分:-2)

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