【问题标题】:UILabel rounding corners cuts-off textUILabel 圆角截断文本
【发布时间】:2017-06-06 06:50:54
【问题描述】:

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

我想要这样的标签。

只有三个角是圆角的。为此,我在单元格的 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)

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

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

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

已编辑:

我的细胞是这样的。

我正在使用下面的代码实现聊天 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
        }

【问题讨论】:

  • 我知道有一个UITableViewCell,如果有,那么你是否实现了必要的约束让它根据里面的文字增长?
  • 是的。我已经提到它是 tableCell。
  • 你需要给UILabel添加边距checkout this question
  • 如果有帮助,您可以采用此库中的圆角方法:github.com/appsquickly/NanoFrame。 .这是旧的 ObjC 代码。
  • 尝试在为角落收音机遮罩之前添加文本。

标签: ios swift


【解决方案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,您可以定义 computed 属性,该属性 由实例变量支持。 self.cellTypeToDraw 没有 值。它只是再次调用getter,然后再次返回self.cellTypeToDraw,依此类推。

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

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

提示 2:

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

【讨论】:

  • 感谢您的回答。它运行良好。但是 didSet 不起作用。 willSet 在这里工作。
  • 如果您使用属性名称而不是 newValuedidSet 也可以使用。
【解决方案2】:

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

【讨论】:

  • 我不明白。我的标签与图像有 8 个像素常数。
  • 答案已编辑。图像到标签的距离没有问题。问题是你需要在标签中添加一些填充。并添加圆角以查看。
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-17
  • 2012-05-09
相关资源
最近更新 更多