限制 UIScrollView 内的 UILabel 的高度

Posted

技术标签:

【中文标题】限制 UIScrollView 内的 UILabel 的高度【英文标题】:Limit the height of a UILabel inside a UIScrollView 【发布时间】:2017-04-25 06:00:54 【问题描述】:

我在 UIScrollView 中有一个 UILabel,UIScrollView 的 contentSize 由 UILabel 中的文本量决定。通过使高度、宽度和纵横比约束为可选,我设法为 UIScrollView 内的 contentView 定义了最小高度。

这就是UIScrollView 的层次结构的样子 -

UIScrollView
    contentView
        UILabel

在某些情况下,即使文本很大并且使标签超出其框架,我希望将UILabel 的框架粘贴到它的方形框架上,而多余的文本会被截断。我正在使用自动布局,所以我相信仅通过设置 UILabel 的框架是不可能的,它与更改约束的优先级有关。

UILabel 的约束 - UILabel 的前导、尾随、顶部和底部连接到 contentView。

UISCrollView的约束-

必填

超级视图的尾随、前导、顶部和底部,即UIScrollView

可选

与超级视图 (UIScrollView) 的高度和宽度相等,纵横比 = 1:1

编辑

我需要这样做,当我将UILabellineBreakMode 设置为NSLineBreakByTruncatingTail 时,文本会自动被截断,textLabel.text 只返回可见文本。

【问题讨论】:

为什么不用 UITextView 而不是 UILabel? @AbdulWaheed 由于某些其他限制,我不能这样做 使用表格视图代替滚动视图。 我会说这更像是一个黑客@KKRocks 啊,没有从问题中理解这一点 - 如果您有一个 IBOutlet 约束,您可以在必要时简单地禁用/启用它,甚至交换约束。 【参考方案1】:

好的,如果我对所有内容都理解正确,您希望有一个可展开的标签,既可以显示整个文本,也可以是方形。这应该像启用/禁用约束一样简单,例如label.height <= label.width(或==,这取决于您希望它看起来像如果文本较少则适合方形标签)。您可以在界面生成器中创建此约束,为其添加一个出口,然后只需执行以下操作:self.labelSquareConstraint.active = YES/NO;

关于您编辑中的问题:没有简单的方法可以从标签中获取文本的可见部分,但是关于此的一些线程,例如:Get truncated text from UILabelUILabel visible part of textCalculate the range of visible text in UILabel

【讨论】:

我一直在使用您提供的第三个链接中的代码。不幸的是,它返回的子字符串太大而无法放入UILabel 我看到 2 种不同的方法来解决这个问题 - 1. 计算适合方形框架的文本数量并设置文本或 2. 让标签以某种方式贴在方形框架上,然后仍然计算使第二种方法完全无用的可见文本 第三个链接的第二个答案为我做了。尽管对于某些字体来说有点不准确,但它做得足够好

以上是关于限制 UIScrollView 内的 UILabel 的高度的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 内的 UIScrollView 时滚动

分页 UIScrollView 内的 UIScrollView

UIScrollview 内的 UIView 内的 UILabel 上的 UIGestureRecognizer

UIScrollview内的UIView内的UIButton,ARC问题

Swift - 通过点击 ScrollView 内的 ViewController 内的按钮来滚动 UIScrollView

UIScrollView 内的 CPTXYGraph