当文本更改为Unicode字符串时,UILabel的子视图消失

时间:2015-03-06 00:44:18

标签: ios uilabel subview unicode-string

我在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"子视图仍在那里。

Howerver第四次,文字被改为"★"子视图消失了。

第五次,文本改为" A"子视图再次出现。

在此代码中,我不会删除子视图,并且会在每个周期中创建新的子视图。 但是,在任何时候,文本都被更改为"★",所有这些子视图都会消失。

如何让子视图出现在UILabel上?

1 个答案:

答案 0 :(得分:2)

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];