首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UILabel舍入角切分文本

UILabel舍入角切分文本
EN

Stack Overflow用户
提问于 2017-06-06 06:50:54
回答 2查看 728关注 0票数 1

我使用的是自定义TableCell,它有一个带有numberofLines = 0的标签

我想要这样的标签。

为了实现这一点,我在单元格的快速文件中编写了这样的代码,我基本上扩展了corners.For。

代码语言:javascript
复制
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
    }
}

我用这样的方法绕过了我的角落。

代码语言:javascript
复制
self.chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)

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

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

任何建议都是高度appreciated.Thanks的。

编辑:

我的手机是这样的。

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

代码语言:javascript
复制
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中的这个变量。

代码语言:javascript
复制
 if indexPath.row % 2 != 0 {
            cell.cellTypeToDraw = .cellTypeReceiver
        }
        else {
            cell.cellTypeToDraw = .cellTypeSender
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-06 07:57:37

你这么做太早了。

设置cellTypeToDraw,从而在布局尚未完成时调用roundCorners(corners:, radius:)方法。在cellForRow(at:)中,您将得到一个可回收单元格,其chatLabel仍然具有与其先前显示的文本匹配的框架。

一个快速的解决方法是将这个角四舍五入移动到单元格的layoutSubviews()方法。类似于:

代码语言:javascript
复制
override func layoutSubviews() {
    super.layoutSubviews()
    chatLabel.roundCorners(corners: [.topLeft,.bottomLeft,.bottomRight], radius: 7.0)
}

(如果只想为某些单元格类型设置圆角,也可以检查cellTypeToDraw。)

顺便问一下:

提示1:

你不应该做那样的事:

代码语言:javascript
复制
var cellTypeToDraw:cellType {
    get {
        return self.cellTypeToDraw
    }
    // ...
}

当您尝试调用并最终使应用程序崩溃时,这将导致无休止的递归。通过实现getter和setter,您可以定义一个没有实例变量支持的计算属性。self.cellTypeToDraw没有价值。它只是再次调用getter,再次返回self.cellTypeToDraw,依此类推。

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

代码语言:javascript
复制
var cellTypeToDraw:cellType {
    didSet {
        // configure your cell here
    }
}

提示2:

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

票数 1
EN

Stack Overflow用户

发布于 2017-06-06 06:58:16

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

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44383164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档