ios - UILabel 圆角截断文本

标签 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
        }

最佳答案

你做得太早了。

您设置了 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. 前缀,以提高可读性并减少工作量。

关于ios - UILabel 圆角截断文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44383164/

相关文章:

ios - 关于 TableViews : How can I manage section titles and rows through classes?

ios - 手动布局中的自动布局

iphone - 即使配置正确,URLForUbiquityContainerIdentifier 也会返回 nil

用于网站的 IOS 应用程序

ios - 如何在 Swift 中按日期对数组进行分组?

ios - uicollectionview 删除顶部填充

ios - Superview 中的自定义 UIView 放置

ios - 从 UITableViewCell 中的 UITextField 获取数据

objective-c - iCarousel in swift version 1.2 报错(candidate is not Objc but protocol requires it)

swift - 从安全分析中获取警告 "Remove the compiler option -rpath to remove @rpath"