UILabel 未在 iOS8 中显示子视图

Posted

技术标签:

【中文标题】UILabel 未在 iOS8 中显示子视图【英文标题】:UILabel not showing subview in iOS8 【发布时间】:2014-11-29 05:57:51 【问题描述】:

目前我为背景制作了一个背面标签,并在 UILabel 上添加了 UIButton。它在 ios 7 中显示,但在 iOS 8 中没有显示。如果我用 UIView 替换 UILabel 那么它工作正常。

如果我使用此代码在 iOS 8 中使用 UILabel 来显示 UILabel 和子视图 UIButton

 UILabel *downLabel = [[UILabel alloc]init];
downLabel.frame    = CGRectMake(0, SCREEN_HEIGHT*0.92, SCREEN_WIDTH,SCREEN_HEIGHT*0.08 );  
[downLabel setBackgroundColor:[UIColor colorWithRed:(66/255.f) green:(67/255.f) blue:(63/255.f)  alpha:1]];
downLabel.userInteractionEnabled = YES;
[self.view addSubview:downLabel];

UIButton *downbtnobj  = [[UIButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH*0.68,downLabel.frame.size.height/10,SCREEN_WIDTH*0.30,downLabel.frame.size.height/1.25)];

UIImage *btndownImage = [UIImage imageNamed:@"img 3.png"];
[downbtnobj setImage:btndownImage forState:UIControlStateNormal];
[downbtnobj addTarget:self action:@selector(bulletInButtonClicked) forControlEvents:UIControlEventTouchUpInside];
[downLabel addSubview:downbtnobj];

现在您可以看到只有 UILabel 正在显示,但 UILabel 上没有显示按钮。

另一个这个如果我用 UIView 替换 UILabel,那么它显示完美。

    UIView *downLabel = [[UIView alloc]init];
downLabel.frame    = CGRectMake(0, SCREEN_HEIGHT*0.92, SCREEN_WIDTH,SCREEN_HEIGHT*0.08 );
[downLabel setBackgroundColor:[UIColor colorWithRed:(66/255.f) green:(67/255.f) blue:(63/255.f)  alpha:1]];
downLabel.userInteractionEnabled = YES;
[self.view addSubview:downLabel];

 UIButton *downbtnobj  = [[UIButton alloc]initWithFrame:CGRectMake(SCREEN_WIDTH*0.68,downLabel.frame.size.height/10,SCREEN_WIDTH*0.30,downLabel.frame.size.height/1.25)];
  UIImage *btndownImage = [UIImage imageNamed:@"img 3.png"];
[downbtnobj setImage:btndownImage forState:UIControlStateNormal];
[downbtnobj addTarget:self action:@selector(bulletInButtonClicked) forControlEvents:UIControlEventTouchUpInside];
[downLabel addSubview:downbtnobj];

在这段代码中,你可以看到我只用 UIView 替换了 UILabel。现在按钮正在显示。

能否帮助解决为什么 iOS8 中的 UILabel 上没有显示子视图

【问题讨论】:

您是否在生命周期方法中执行此操作(viewDidLoad、viewWillAppear 等)? 如果你把按钮放在标签的前面而不是作为它的子视图呢?那样有用吗?如果是这样,您已经找到了解决方法。 我正在 viewDidLoad 中做这项工作.. 但它在 iOS 7 中运行良好 .. 但在 iOS 8 中没有显示按钮 我认为@kpsharp 暗示viewDidLoad 可能为时过早。作为一个实验,尝试将代码移动到viewDidAppear,看看它是否有任何不同...... 【参考方案1】:

目前尚不清楚 iOS 8 中的标签有何不同,但如果您在标签上调用 layoutIfNeeded,则可以解决问题(需要在设置框架之后),

UILabel *downLabel = [[UILabel alloc]init];
downLabel.frame    = CGRectMake(0, SCREEN_HEIGHT*0.92, SCREEN_WIDTH,SCREEN_HEIGHT*0.08 );  
[downLabel layoutIfNeeded];
[downLabel setBackgroundColor:[UIColor colorWithRed:(66/255.f) green:(67/255.f) blue:(63/255.f)  alpha:1]];
downLabel.userInteractionEnabled = YES;
[self.view addSubview:downLabel];

编辑后:

我还发现,如果您设置文本(在创建标签后的任何时间),按钮就会出现。

【讨论】:

不错。 iOS 8 中肯定有一些关于标签何时获得布局以及对整个界面产生什么影响的新内容。尤其是在 iOS 8 的早期测试版中,我遇到了很多麻烦。 在 iOS 10 中仍然有效。值得注意的是,将 text 设置为 nil 可能会导致子视图再次消失,因此保持文本非零(如果适用,甚至设置为 "")是可能是最好的解决方案。 thk,它解决了我的问题。【参考方案2】:

您需要在 UILabel 上设置 clipsToBounds 的非常简单的方法

downLabel.clipsToBounds = YES;

【讨论】:

以上是关于UILabel 未在 iOS8 中显示子视图的主要内容,如果未能解决你的问题,请参考以下文章

自定义 UILabel 视图未在 Interface Builder 中更新其框架

IOS - UIView中使用AutoLayout的UILabel动态高度

UIAlertView 按钮(子视图)未在 iOS 7 中显示

为啥我的 UIView 的 UILabel 子视图不显示?

UILabel 重绘视图。如何避免这种行为?

自定义安装字体未在 UILabel 中正确显示