我在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上?
答案 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];