【问题标题】:What to do if label is bigger than parent UIVIew?如果标签比父 UIVIew 大怎么办?
【发布时间】:2015-05-22 10:45:51
【问题描述】:

我有两个多行UILabels。父 UIView 只有一定的大小(高度),但标签可以包含一个长字符串。我想要的是始终显示第一个标签(例如,如果它太长,则缩写为 ...)。如果有空间,则应显示第二个标签。同样,如果它太长,它应该被缩写为 ...

这是我当前使用的约束:V:|-5-[title]-0-[description]-(>=0)-|

在某些情况下,第二个标签会像这样被切断:

我该怎么办?我必须更改约束吗?我可以以某种方式隐藏第二个标签吗?但是我应该如何检测标签何时被切断?

在另一种情况下,根本没有显示第二个标签。第二个标签也不应该溢出父UIView。这种情况应该如何处理?

【问题讨论】:

  • 淡紫色是包含2个标签的视图?
  • @Bhavin:是的,它确实包含两个标签。
  • ok...和它的固定高度视图?
  • 高度是固定的。所以我必须尽可能地利用可用空间。
  • 好的...那么您为什么不尝试将视图缩小一些以防止这种情况发生,或者尝试将字体大小设置为大 1pt....

标签: ios autolayout uilabel


【解决方案1】:

我相信四舍五入发生在 iOS 的某个地方,因为如果有 0.75pt 更多的空间,标签会适合(一行,然后在末尾加上 ...)。所以它绘制它但由于缺少 0.75pt 空间而被切断。

现在我采用了以下方法:计算第二个标签(应该是大约一行的参考文本)是否适合父视图?如果不隐藏它。我只有 C# 代码,但你应该明白:

public override void LayoutSubviews ()
{
    base.LayoutSubviews ();

    NSString referenceTextToMeasure = new NSString ("Lorem ipsum dolor sit amet.");
    // take the font of the description label which was cut off
    CGRect referenceTextRect = referenceTextToMeasure.GetBoundingRect (
        new CGSize(this.Frame.Width, nfloat.MaxValue), 
        NSStringDrawingOptions.UsesLineFragmentOrigin, 
        new UIStringAttributes () { Font = descriptionLabelFont }, 
        new NSStringDrawingContext ()
    );

    // 5 is the spacing constraint I have on the top
    if ((this.Frame.Height - TitleLabel.Frame.Height - 5) < referenceTextRect.Height )
        DescriptionLabel.Hidden = true;
}

似乎工作得很好,但必须进行全面测试。您也可以使用固定高度而不是 referenceTextRect.Height,这样可以节省一些计算。不过,我使用的方式允许调整字体,所以一切都是动态计算的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2011-06-22
    • 1970-01-01
    • 2021-09-13
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多