如果标签比父母UIVIew大,该怎么办?

时间:2015-05-22 10:45:51

标签: ios autolayout uilabel

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

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

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

second label is cut off

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

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

1 个答案:

答案 0 :(得分:0)

我认为在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,您可以保存一些计算。然而,我使用的方式允许调整字体,以便动态计算所有内容。