label 比父 UIVIew 大怎么办?

What to do if label is bigger than parent UIVIew?

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

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

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

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

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

我认为舍入发生在 iOS 的某处,因为如果多出 0.75pt space,标签将适合(一行,然后在末尾加上...)。所以它绘制它但由于缺少 0.75pt space.

而被截断

现在我采用了以下方法:计算第二个标签(参考文本应该大约一行)是否适合父视图?如果不隐藏它。我只有 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 并且可以节省一些计算。尽管如此,我使用的方式允许调整字体,因此所有内容都是动态计算的。