UIScrollView фантомные подпредставления - PullRequest
18 голосов
/ 14 апреля 2011

Я загружаю представление из файла пера, используя:

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

Пил содержит представление прокрутки с именем gridScrollView, и в файле реализации AnalysisView у меня есть метод, который добавляет представления в качестве подпредставлений к представлению scrollview:

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++;
}

Я установил делегат scrollviews равным AnalysisView и подключил метод do end decelaring

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
      NSLog(@"%d", [scrollView.subviews count]);
}

Когда метод scrollViewDidEndDecelerating запускает, он сообщает, что количество подпредставлений равно 5. 3из этих подпредставлений GridViews, которые я ожидаю.Однако есть 2 UIImageViews, которые я понятия не имею, почему они там есть.

Это проблема, потому что я намерен получить представления с помощью viewWithTag в методе scrollViewDidEndDecelerating и вызвать метод для представления, однако всякий раз, когда я пытаюсьчтобы получить представление с тэгом 0, я получу один из UIImageView, и это приведет к сбою моего приложения, потому что метод не может быть вызван для представления изображения.

Я знаю, как обойти это, чтобы сохранить мойGridViews в отдельном массиве экземпляров и ссылки на них оттуда.Но мне любопытно узнать, что такое 2 UIImageViews и как они туда попали.

1 Ответ

45 голосов
/ 14 апреля 2011

UIScrollView по умолчанию содержит 2 UIImageViews в качестве подпредставлений для индикаторов прокрутки. Хотя я не могу найти что-то конкретное о реализации индикаторов прокрутки в документах, эти изображения отображаются в объявлении класса (см. Заголовок UIScrollView.h):

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

Вы также можете начать присваивать теги не с 0, а с некоторого положительного числа - таким образом, избегая столкновения со стандартными подпредставлениями

...