【问题标题】:How to set label height for auto adjust in Read More/Less with Swift 3?如何使用 Swift 3 在 Read More/Less 中设置自动调整的标签高度?
【发布时间】:2017-07-07 09:14:34
【问题描述】:

我想在结尾处创建带有 Read More/Read Less 的段落。
这是我的代码;

func getLabelHeight(text: String, width: CGFloat, font: UIFont) -> CGFloat {

    let lbl = UILabel(frame: .zero)
    lbl.frame.size.width = width
    lbl.font = font
    lbl.numberOfLines = 0
    lbl.text = text
    lbl.sizeToFit()
    lbl.adjustsFontSizeToFitWidth = true
    return lbl.frame.size.height

}


 @IBAction func btnReadMore(_ sender: Any) {
    if isLabelAtMaxHeight {

        btnReadmore.setTitle(NSLocalizedString("Read more", comment: ""), for: .normal)
        btnReadmore.titleLabel!.font = UIFont (name: "Tharlon", size: 13)
        isLabelAtMaxHeight = false
        lblReviewHeight.constant = 29
        lblReview.font = UIFont (name: "Tharlon", size: 13)


    }
    else {

        btnReadmore.setTitle(NSLocalizedString("Read less", comment: ""), for: .normal)
        btnReadmore.titleLabel!.font = UIFont (name: "Tharlon", size: 13)
        isLabelAtMaxHeight = true
        lblReviewHeight.constant = getLabelHeight(text: lblReview.text!, width: view.bounds.width, font: lblReview.font)
        lblReview.font = UIFont (name: "Tharlon", size: 13)
        lblReview.lineBreakMode = NSLineBreakMode.byTruncatingHead

    }

}


我还在属性检查器中设置了标签“自动换行”。
问题是当我在 Read Less 部分添加 "NSLineBreakMode.byTruncatingHead" 时,所有文本都完全显示。但是,文本中那些地方的一些单词消失了。

因此,我删除了该代码并运行该应用程序。那时,文本没有完全显示,只显示一半。我一整天都在努力解决这个问题。
我不想使用任何其他库。
谁能帮帮我?

【问题讨论】:

    标签: ios swift3 uilabel nsattributedstring


    【解决方案1】:

    删除约束lblReviewHeight,然后尝试使用numberOfLines 控制您的文本布局,如果您想显示所有描述集numberOfLines = 0,否则将numberOfLines 设置为您想要的行。

    【讨论】:

    • 兄弟我无法删除 lblReviewHeight 因为当我点击阅读更多/更少按钮时它控制标签的高度。
    • @MayPhyu 自动布局将自动为我们计算高度,如果您对该标签有正确的约束,这意味着如果您的标签有正确的约束 widthleading trailing 或 @ 987654328@ right 或提供preferredMaxLayoutWidth 您将获得此标签的best 大小。
    【解决方案2】:

    要通过字体和宽度计算文本高度,您可以使用此扩展程序

    extension UIFont {
    func sizeOfString (_ string: String, constrainedToWidth width: CGFloat) -> CGSize {
        return NSString(string: string).boundingRect(with: CGSize(width: width, height: CGFloat.greatestFiniteMagnitude),
                                                             options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                                             attributes: [NSFontAttributeName: self],
                                                             context: nil).size
    }
    }
    

    然后调用它

    let width = 290.0
    let textSize = UIFont.systemFont(ofSize: 15).sizeOfString("text", constrainedToWidth: width)
    

    【讨论】:

    • 兄弟@VadimKozak,兄弟,我应该在我的代码中删除或替换哪些代码?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多