UIScrollView 幻象子视图

Posted

技术标签:

【中文标题】UIScrollView 幻象子视图【英文标题】:UIScrollView phantom subviews 【发布时间】:2011-04-14 13:51:07 【问题描述】:

我正在使用 nib 文件加载视图:

NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"AnalysisView" owner:self options:nil];
AnalysisView *gridView = [nibViews objectAtIndex: 0];

nib 包含一个名为 gridScrollView 的滚动视图,在 AnalysisView 实现文件中,我有一个将视图作为子视图添加到滚动视图的方法:

for (NSInteger i = [results count] -1; i >= 0; i--) 

    Result *result = [results objectAtIndex:i];
    [self loadResult: result];


- (void) loadResult: (Result *) result

    NSArray *nibViews = [[NSBundle mainBundle] loadNibNamed:@"GridView" owner:self options:nil];
    GridView *gridView = [nibViews objectAtIndex: 0];
    gridView.tag = self.graphCount;

    CGRect gridFrame = gridView.frame;

    CGFloat yOffset = gridFrame.size.height * self.graphCount;
    gridView.frame = CGRectMake(0, yOffset, gridFrame.size.width, gridFrame.size.height);

    [self.gridScrollView addSubview: gridView];
    self.gridScrollView.contentSize = CGSizeMake(self.gridScrollView.frame.size.width, (yOffset + gridFrame.size.height));

    self.graphCount++;

我已将滚动视图委托设置为 AnalysisView 并连接了 do end decelaring 方法

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

      NSLog(@"%d", [scrollView.subviews count]);

当 scrollViewDidEndDecelerating 方法触发时,它报告子视图的数量是 5。这些子视图中的 3 个是我期望的 GridView。但是有 2 个 UIImageViews 我不知道它们为什么在那里。

这是一个问题,因为我打算在 scrollViewDidEndDecelerating 方法中使用 viewWithTag 检索视图并在视图上调用一个方法,但是每当我尝试检索标签为 0 的视图时,我都会检索其中一个 UIImageView 和 this导致我的应用程序崩溃,因为无法在图像视图上调用该方法。

我知道一种解决方法是将我的 GridView 存储在一个单独的实例数组中并从那里引用它们。但我很想知道这 2 个 UIImageView 是什么以及它们是如何到达那里的。

【问题讨论】:

【参考方案1】:

UIScrollView 默认包含 2 个UIImageViews 作为滚动指示器的子视图。虽然我在文档中找不到任何关于滚动指示器实现的具体内容,但这些图像视图存在于类声明中(请参阅UIScrollView.h 标头):

UIKIT_CLASS_AVAILABLE(2_0) @interface UIScrollView : UIView <NSCoding> 
    ...
    UIImageView* _verticalScrollIndicator;
    UIImageView* _horizontalScrollIndicator;

您也可以不从 0 开始分配标签,而是从某个正数开始 - 这样可以避免与标准子视图发生冲突

【讨论】:

谢谢 - 你知道我在哪里可以找到有关此文档的任何信息吗? 我确实尝试在代码中创建一个 UIScrollView 并检查它的子视图计数,但它为零。我只能猜测它不会添加子视图,直到它被绘制在屏幕上 可能是的 + 尝试使用 showHorizo​​ntal/VerticalScrollIndicator 属性 - 如果我记得正确将其设置为 NO 会有效地从滚动视图中删除指示器(但我可能在这里错了)

以上是关于UIScrollView 幻象子视图的主要内容,如果未能解决你的问题,请参考以下文章

使用嵌入式 UIView 调整 UIScrollView 的 contentSize?

UICollectionViewCell与UIScrollView取消didSelectItemAtIndexPath

调整容器 uiscrollview 中所有 uiscrollview 的大小

UIScroll 视图未按预期工作

如何使用 autoLayouts 动态增加 UIScrollView 的高度

iOS - 当文本字段在子视图内时,键盘上的 UIScroll 弹出到文本字段