【问题标题】:Subview of UILabel disappears when the text was changed to Unicode string当文本更改为 Unicode 字符串时,UILabel 的子视图消失
【发布时间】:2015-03-06 00:44:18
【问题描述】:

我在 iOS 开发中看到 UILabel 及其子视图的奇怪行为。 我想在 UILabel 上有一个覆盖视图,并且只想更改标签的文本。

当文本是数字或字母时效果很好。 但是,当我将文本更改为 Unicode 字符串时,子视图消失了。

为了重现这个问题,我创建了一个简单的项目,它只有一个标签和一个按钮。

标签有一个“A”作为初始文本。 当点击按钮时,会调用下面的方法,循环改变UILabel的文本。

- (void)pushButton:(id)sender
{
    if ([[_label text] isEqualToString:@"A"]) {
        [_label setText:@"B"];

        // add a subview on the label
        UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
        [view setBackgroundColor:[UIColor blueColor]];
        [_label addSubview:view];

    } else if ([[_label text] isEqualToString:@"B"]) {
        [_label setText:@"C"];
    } else if ([[_label text] isEqualToString:@"C"]) {
        [_label setText:@"D"];
    } else if ([[_label text] isEqualToString:@"D"]) {
        [_label setText:@"\u2605"];
        // after this, the subview disappears
    } else {
        [_label setText:@"A"];
        // after this, the subview appears again
    }
}

当我第一次点击按钮时,文本变为“B”并出现子视图。

第二次和第三次,文字改成“C”和“D”,子视图还在。

然而第四次,文字变成了“★”,子视图消失了。

第五次,文字变为“A”,再次出现子视图。

在这段代码中,我没有删除子视图,并且在每个循环中都会创建新的子视图。 但是,在任何时候将文本更改为“★”,所有这些子视图都会消失。

如何让子视图显示在 UILabel 上?

【问题讨论】:

    标签: ios uilabel subview unicode-string


    【解决方案1】:

    UILabel 不打算有子视图。解决方案是让您的蓝色矩形成为标签的超级视图的子视图。你可以定位它,让它出现在你的 UILabel 前面。

    因此,你有这个代码:

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    [view setBackgroundColor:[UIColor blueColor]];
    [_label addSubview:view];
    

    你会这样说:

    UIView *sup = [_label superview];
    UIView *view = [UIView new];
    [view setBackgroundColor:[UIColor blueColor]];
    CGRect r = CGRectMake(0,0,20,20);
    r = [sup convertRect:r fromView:_label];
    view.frame = r;
    [sup addSubview: view];
    

    【讨论】:

    • 谢谢。我发现它发生在 iOS8.1 模拟器上,但它不在 iOS7.1 模拟器上。你是哪个版本做的?我觉得这可能是 iOS8.1 上的一个错误。
    • 我的测试是在 8.1 中。我要告诉你的是 其他东西 导致了这个问题。自己试试吧!用仅你发布的代码做一个例子,你会看到当“星”出现时子视图并没有神秘地消失。
    • 我做了几次测试,我发现到底发生了什么。当文本更改为 Unicode 字符串时,子视图移动到 UILabel 的后面。在我的测试中,UILabel 有背景颜色,我将背景颜色更改为透明颜色,我可以看到 UIlabel 后面的子视图。当我将背景颜色更改为另一种颜色时,不会显示子视图。
    • 好的,我提供了完全不同的答案和解决方法。您应该向 Apple 提交错误,但我希望他们会告诉您这种行为不是错误,因为您实际上不应该为标签提供子视图。
    • 谢谢。我了解 UILabel 不打算有子视图。我将更改我的代码。
    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多