UIScrollView с UIB-кнопками, «пропускающими», когда палец тянет за пределы своих суперпредставлений - PullRequest
1 голос
/ 15 сентября 2011

У меня есть scrollView, настроенный как titleView из navigationBar. contentView из scrollView имеет 4 кнопки, все расположены динамически. Кнопки нужно отменить с помощью перетаскивания и прокрутки, поэтому я выделил их под setEnabled:NO, когда touchesMoved.

Когда я пытаюсь прокрутить scrollView, как только я пересекаю границы суперпредставления (то есть, пропуская нижнюю или верхнюю границы навигационной панели), scrollview пропускает 8 или 11 пикселей, в зависимости от того, является ли он верхним или кнопка. Это как-то связано с UIButtons, потому что когда я просто использую UILabels, проблема не сохраняется.

Соответствующий код:

Инициализация прокрутки:

    menuWidth = 196;
    rowHeight = 40;
    rowMargin = self.frame.size.height - rowHeight;

    //drop down menu stuff
    self.scrollView = [[UIScrollView alloc] initWithFrame:self.frame];

    scrollView.backgroundColor = [UIColor clearColor];
    scrollView.contentSize = CGSizeMake(self.frame.size.width, (self.frame.size.height)*choices.count);
    scrollView.pagingEnabled = YES;
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
    scrollView.clipsToBounds = YES;
    scrollView.canCancelContentTouches = YES;
    scrollView.delaysContentTouches = YES;
    scrollView.delegate = self;
    [self layoutMenu];
    [self addSubview:scrollView];
    [scrollView release];

Кнопка инициализации (-layoutMenu):

SKScrollableButton *tempButton;
NSString *text;
for (int i = 0; i < choices.count; i++) {
    text = (NSString*)[choices objectAtIndex:i];
    if (i == 0) {
        text = [text stringByAppendingString:downArrow];
    }
    CGRect labelRect = CGRectMake(0, i*(rowHeight + rowMargin), menuWidth, rowHeight - 7);

    tempButton = [[SKScrollableButton alloc] initWithFrame:labelRect];
    [tempButton setTitle:text forState:UIControlStateNormal];
    [tempButton addTarget:self action:@selector(buttonDown:) forControlEvents:UIControlEventTouchDown];
    [tempButton addTarget:self action:@selector(buttonUpInside:) forControlEvents:UIControlEventTouchUpInside];
    [self.scrollView addSubview:tempButton];
    [tempButton release];
}

Нет событий, вызываемых кнопками, когда происходит пропуск, и только scrollViewDidScroll обычные вызовы делегата происходят на scrollView.

Я проверял, и пропуск определенно происходит, когда выходят за пределы суперпредставления, а не за пределы самого scrollView.

...