为什么UIScrollView在滚动时将UIImageView子视图添加到其子视图中

时间:2014-02-06 17:13:26

标签: ios objective-c uiscrollview uiimageview uikit

如果标题没有告诉你什么,这是我最近发现的并且好奇: 在我的应用程序中,我有一个带按钮的UIScrollView。这些按钮每个都有一个子视图 - UILabel的一个实例。有时触发的特定事件会更改标签中的文本,我还需要更改标签和按钮的框架,以便显示整个文本(不会被截断)。所以我抓住了按钮的第一个子视图并检查了它的文本需要多少空间。

如果在滚动期间发生该事件,则会导致崩溃。事实证明,除了标签之外,每个按钮还有另一个子视图,它是UIImageView的实例。起初我认为在滚动过程中,UIScrollView会获取其子视图的“屏幕截图”,并将图像置于顶部,这样动画滚动在性能方面稍微便宜一些。然而,这个逻辑是有缺陷的,因为UIImageView是索引0处的子视图,所以它被放在我的标签下面。

任何人都知道为什么会这样?苹果工程师用这种奇怪的机制试图实现什么目标?

请注意,实际上它可能仅适用于按钮。此外,我检查了标签,他们没有任何子视图。

1 个答案:

答案 0 :(得分:1)

UIButtons背景图片UIImageViewnil,直到您调用- (void)setImage:(UIImage *)image forState:(UIControlState)state或使用Interface Builder设置它。所以我假设索引0处的子视图将是背景图像,因为它将首先被绘制为低于其他所有。

您可以采取哪些措施来确保获得正在寻找的UILabel是这样的:

- (UILabel *)getLabelForButton:(UIButton *)button
{
    for (id subView in button.subviews)
    {
        if ([subView isKindOfClass:[UILabel class]])
        {
            return subView;
        }
    }
    return nil;
}