UIScrollView幽灵子视图

18

我正在使用以下方式从一个nib文件中加载视图:

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

笔画包含了一个名为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++;
}

我已将scrollview的代理设置为AnalysisView,并连接了did end decelerating方法。

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
      NSLog(@"%d", [scrollView.subviews count]);
}
当scrollViewDidEndDecelerating方法被触发时,它报告子视图的数量为5。其中3个子视图是我预期的GridViews。但是有两个UIImageViews,我不知道它们为什么在那里。
这是一个问题,因为我打算在scrollViewDidEndDecelerating方法中使用viewWithTag检索视图,并调用视图上的方法,但是每当我尝试检索标记为0的视图时,我将检索到其中一个UIImageView,这会导致我的应用程序崩溃,因为无法在图像视图上调用该方法。
我知道解决这个问题的方法是将我的GridViews存储在单独的实例数组中,并从那里引用它们。但我很想知道这两个UIImageViews是什么以及它们是如何出现的。
1个回答

45

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

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

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


谢谢 - 你知道在文档中哪里可以找到关于这个的信息吗? - JFoulkes
我曾尝试在代码中创建UIScrollView并检查其子视图计数,但结果为零。我只能猜测它在屏幕上绘制之前不会添加子视图。 - JFoulkes
6
可能是的 + 尝试使用 showsHorizontal/VerticalScrollIndicator 属性 - 如果我没记错,将其设置为 NO 可以有效地从滚动视图中移除指示器(但我可能记错了)。 - Vladimir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接