ios - 为什么 UIScrollView 在滚动时将 UIImageView subview 添加到其 subview 中

标签 ios objective-c uiscrollview uiimageview uikit

如果标题没有告诉您任何信息,以下是我最近发现并很好奇的内容: 在我的应用程序中,我有一个带有按钮的 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/

相关文章:

ios - 如果在 viewcontroller 中使用 UITabbar,如何设置 homeview controller

iOS Facebook 3.1 API - "Posted by"未显示我们的应用

iOS 8 - 无法安装企业应用程序

objective-c - 尝试在 UIView 中绘制

objective-c - 如何获得动画 CAEmitterLayer/Cell 的发射器位置?

ios - 如何使用多个选择器 View ?

ios - 如何更改选中和未选中的选项卡栏图像颜色

ios - 滚动时如何找到 ScrollView 的位置

iphone - 从磁盘加载图像时的 ScrollView 和表格 View 性能

ios - UIScrollView 缩放不适用于自动布局