【问题标题】:Why is UIScrollView adding UIImageView subviews to its subviews when scrolling为什么 UIScrollView 在滚动时将 UIImageView 子视图添加到其子视图中
【发布时间】:2014-03-03 18:58:48
【问题描述】:

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

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

有人知道为什么会这样吗? Apple 工程师试图通过这种奇怪的机制实现什么目标?

请注意,它实际上可能只发生在按钮上。另外,我检查了标签,它们没有任何子视图。

【问题讨论】:

    标签: ios objective-c uiscrollview uiimageview uikit


    【解决方案1】:

    UIButtons 有一个 UIImageView 作为背景图像(在您调用 - (void)setImage:(UIImage *)image forState:(UIControlState)state 或使用 Interface Builder 设置之前,它是 nil)。所以我会假设索引 0 处的子视图将是背景图像,因为它会首先被绘制在其他所有内容的下方。

    您可以执行以下操作以确保获得您正在寻找的UILabel

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

    【讨论】:

    • 我的按钮没有任何背景图片并且是透明的。此外,这只发生在滚动过程中,否则唯一的子视图是标签。不过可能与它有关。
    • 刚刚编辑了我的答案,给你一个建议,确保你只拉出标签,这样你就不会得到一个实际上没有框架的对象。
    • 我已经修好了。我只是在这里询问有关为什么会出现图像视图的想法。纯粹出于好奇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多