iOS UIScrollView clipToBounds = NO Подвидов не обнаружено - PullRequest
5 голосов
/ 17 января 2012

У меня есть представление прокрутки, которое имеет ширину / высоту 256x256.У меня есть подпредставления этого вида прокрутки, растягивающегося в обоих направлениях (влево и вправо).Я установил для clipToBounds значение NO, чтобы я мог видеть элементы в представлении прокрутки.

Когда пользователь касается пространства в держателе просмотра прокрутки (область, которая выходит за пределы 256x256), я проверяю совпадение и возвращаю scrollView.

Моя проблема в том, что элементы моего прокрутки представляют собой кнопки, и если кнопка не находится внутри 256x256, она не получает сенсорные события.Как циклически переключаться между кнопками на просмотре прокрутки, а затем пересылать события на кнопки?

Я делаю так Пейджинг UIScrollView с просмотром соседних страниц

Номои подпредставления прокрутки не получают события.

Я пробовал все следующее в моем представлении, которое должно отправлять события по проводам, и мои кнопки не будут получать события.Цепочка событий всегда останавливается на моем представлении UIScroll - что позволяет мне прокручивать мои элементы - но как мне перенаправить события на кнопки из представления прокрутки?

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return self.scrollView;
    }
    return nil;
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    if ([self pointInside:point withEvent:event]) {
        return self.scrollView;
    }
    return nil;
}

- (UIView *) hitTest:(CGPoint) point withEvent:(UIEvent *)event {
    UIView* child = nil;

    if ((child = [super hitTest:point withEvent:event]) == self) {
        return self.scrollView;
    }
    return child;
}

Ответы [ 4 ]

6 голосов
/ 17 января 2012

Это был ответ и лучшее решение.Вместо произвольного представления для пересылки событий, мы просто делаем это в UIScrollView, и все кнопки и пролистывания работают нормально.

- (UIView )hitTest:(CGPoint)point withEvent:(UIEvent )event {
    UIView *view = [super hitTest:point withEvent:event];
    for (UIView *subview in self.subviews) {
        if (view != nil && view.userInteractionEnabled) {
            break;
        }
        CGPoint newPoint = [self convertPoint:point toView:subview];
        view = [subview hitTest:newPoint withEvent:event];
    }
    return view;
}
0 голосов
/ 24 марта 2014

См. Раздел Обнаружение касаний вне вида прокрутки в учебном пособии Мэтта Галлоуэя Как использовать UIScrollView для прокрутки и масштабирования контента -

Вы делаете вид прокрутки меньше экрана, а при отключенном просмотре клипов:

Xcode screenshot

И оберните его в контейнерное представление, которое перенаправляет события в представление прокрутки:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == self) {
        return _scrollView;
    }
    return view;
}
0 голосов
/ 17 января 2012

Вы переопределяли hitTest UIScrollView?

- (UIView*)hitTest:(CGPoint)pt withEvent:(UIEvent*)event 
{
    UIView *contentView = [self.subviews count] ? [self.subviews objectAtIndex:0] : nil;
    return [contentView hitTest:pt withEvent:event];
}
0 голосов
/ 17 января 2012

Ваш прокрутка должна быть больше. Все события за пределами основного кадра прокрутки не будут обнаружены. Если вам нужно показать пользователю определенную фоновую зону, то сделайте фон прокрутки прозрачным и оставьте другой вид позади.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...