【问题标题】:Making UILabels of different size with adjustsFontSizeToFitWidth have the same font size用 adjustsFontSizeToFitWidth 使不同大小的 UILabel 具有相同的字体大小
【发布时间】:2017-05-31 23:33:56
【问题描述】:

我有许多 UILabel,所有这些都将 adjustsFontSizeToFitWidth 设置为 true。它们都是不同的大小,其中的文本长度也会不同,所以本质上每个标签中的文本大小可以是任意的。

我的目标是让它们的文本大小相同,以便在每个标签确定其文本必须有多小才能适合之后,它们都将文本大小调整为其中最小字体大小的大小UILabel。这是最大的字体大小,足以容纳每个标签的文本。

我也考虑过为每个标签手动计算允许其文本适合的最大字体大小,然后将每个标签的字体大小设置为这些字体大小中的最小者,但我不知道该怎么做这个计算。

【问题讨论】:

  • 您能否遍历子视图 - 仅检查 UILabels - 拉出字体大小 - 然后再次循环,将每个标签设置为您需要的字体大小?
  • 您可能需要手动计算。我刚刚对我的建议进行了测试,似乎调整为适合的字体大小未反映在 UILabel.font.pointSize 值中。他们都在 17 岁时回来了。:-/
  • @dfd 我认为是的,缩小后显示的字体大小与标签字体中存储的字体大小无关(除了它不大于)。您知道如何计算单元格布局文本之前的最终大小吗?这将解决我的问题。
  • 很遗憾没有。我有一些代码——去年丢失了——计算字体大小的宽度(可能是谷歌搜索)——但它丢失了。但是,请查看此链接:stackoverflow.com/questions/8812192/…。列出的第二个答案是承诺计算文本的高度/宽度,而不需要太多的试验和错误来达到“完美”的字体大小。我将为此添加书签以供将来参考。

标签: ios swift uilabel


【解决方案1】:

您必须遍历标签才能找到所需的最小尺寸。检查此代码

    let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 10))
    let textArray = ["asdasdas","asdsd","asdas"]
    let size : CGFloat = 14
    var minimumSize = size
    for string in textArray{
        var i : CGFloat = 0
        while size-i>0 {
            let font = UIFont.systemFont(ofSize: size-i)
            let preferredSize = label.preferredLabelSize(maximumFrameBounds: view.frame, font: font, text: string)
            if label.frame.size.width>=preferredSize.width{
                minimumSize = min(size-i, minimumSize)
                print(minimumSize)
                break
            }
            i += 1
        }
        print(minimumSize)
    }

我只是遍历同一标签上的字符串数组,以找到需要显示的最小字体大小。不确定这是否会完美运行,但这将为您指明正确的方向。您需要使用其文本遍历标签以找到最小字体大小,而不是遍历字符串数组。您可以尝试修改标签的宽度或数组中的字符串,以查看它是否按您的意愿工作。另外,如果可以的话,我建议你使用自动布局,让操作系统处理大小而不是手动计算字体大小。

【讨论】:

  • 谢谢。自动布局的问题是,如果标签的大小都相同(在我的情况下它们是相同的,但这并不重要)但包含不同长度的文本(这很重要),那么它们都会调整它们的文本大小以适应本身,这意味着较长的字符串获得较小的字体大小。我希望所有标签的字符串都具有相同(最小)的字体大小。本质上,我想将标签的字体大小限制为相等,但自动布局不允许这样的事情。
  • 自动布局不会调整文本大小,如果你不指定高度/宽度并使标签多行,它会改变标签的框架大小。但是,是的,我知道您希望所有标签的大小相同:)
  • 但是,我认为您的答案应该有效。只有一个问题:它与自动布局兼容吗?我需要 setNeedsDisplay() 进行旋转更改吗?无论如何,我会尽快测试它。谢谢。
  • 你没有改变框架,你只是改变了字体大小,所以你不必为此烦恼。
  • 抱歉,你的意思是改变方向,我想你需要再次调用它,因为框架会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2013-11-18
  • 2016-01-04
  • 1970-01-01
  • 2015-10-29
  • 2017-04-14
相关资源
最近更新 更多