如果标题没有告诉您任何信息,以下是我最近发现并很好奇的内容: 在我的应用程序中,我有一个带有按钮的 UIScrollView。这些按钮各有一个 subview ——一个 UILabel 的实例。有时会触发一个特定的事件来更改标签中的文本,我还需要更改标签和按钮的框架,以便可以显示整个文本(不会被截断)。所以我只是捕获了一个按钮的第一个 subview 并检查了它的文本需要多少空间。
如果该事件发生在滚动期间,这会导致崩溃。事实证明,除了标签之外,每个按钮都有另一个 subview ,它是 UIImageView 的实例。起初我认为在滚动过程中,UIScrollView 会获取其 subview 的“屏幕截图”,并将图像放在顶部,这样滚动动画在性能方面的成本会降低一些。然而,这个逻辑是有缺陷的,因为 UIImageView 是索引 0 处的 subview ,所以它被放在我的标签下面。
有人知道为什么会这样吗? Apple 工程师试图通过这种奇怪的机制实现什么目标?
请注意,它实际上可能只发生在按钮上。另外,我检查了标签,它们没有任何 subview 。
最佳答案
UIButtons
有一个 UIImageView
作为背景图像(它是 nil
直到你调用 - (void)setImage:(UIImage *)image forState:(UIControlState)state
或使用 Interface Builder 设置)。所以我假设索引 0 处的 subview 将是背景图像,因为它将首先绘制在其他所有图像的下方。
为了确保获得您正在寻找的 UILabel
,您可以采取如下措施:
- (UILabel *)getLabelForButton:(UIButton *)button
{
for (id subView in button.subviews)
{
if ([subView isKindOfClass:[UILabel class]])
{
return subView;
}
}
return nil;
}
关于ios - 为什么 UIScrollView 在滚动时将 UIImageView subview 添加到其 subview 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21609553/