gpt4 book ai didi

objective-c - 如何判断 UILabel 何时将被截断和/或其换行位置将更改

转载 作者:可可西里 更新时间:2023-11-01 04:36:09 51 4
gpt4 key购买 nike

我有一个多行 UILabel (numberOfLines = 0)。它的宽度可以在运行时改变,有时这会导致截断和/或重新包装。一些例子最能说明这一点:

示例1:宽度的减小导致不同的断行点

enter image description here enter image description here

示例2:宽度减小导致截断

enter image description here enter image description here

示例 3:宽度的减少导致截断和不同的换行位置

enter image description here enter image description here

示例4:宽度的减少对截断或换行位置没有任何影响

enter image description here enter image description here

由于这种格式上的变化可能非常刺耳,我打算将其隐藏在一些动画(可能是淡入/淡出)后面。然而,第一个障碍是确定何时我需要这样做。我不想在标签调整大小时应用动画 - 仅当它会导致截断或换行位置发生变化时才应用动画。

我该如何测试它?对于示例 1、2 和 3,测试应返回 YES,但对于示例 4 应返回 NO。

注意:调整大小永远不会改变我示例中的行数。

注意 2:如果有人有更好的与文本格式相关的标签,我很想知道它们 - 请随时编辑。

注意 3:如果您有兴趣看到此行为的完成,请在 iPhone 上试用 Apple 的 mail.app。查看收件箱时,滑动电子邮件并观察摘要行在重新包装和/或截断时淡入/淡出(但在不需要时不会)。

最佳答案

Swift 3 解决方案

您可以在分配字符串后统计行数,并与标签的最大行数进行比较。

import Foundation
import UIKit

extension UILabel {

func countLabelLines() -> Int {
// Call self.layoutIfNeeded() if your view is uses auto layout
let myText = self.text! as NSString
let attributes = [NSFontAttributeName : self.font]

let labelSize = myText.boundingRect(with: CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
}

func isTruncated() -> Bool {

if (self.countLabelLines() > self.numberOfLines) {
return true
}
return false
}
}

关于objective-c - 如何判断 UILabel 何时将被截断和/或其换行位置将更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12945978/

51 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com