2012-01-16 2 views
5

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

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

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

я делаю как этот Paging UIScrollView with peeking neighbor pages

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

Я пробовал все следующие, на мой взгляд, которые должны отправлять события по проводам, а мои кнопки не будут получать события. Цепочка событий всегда останавливается в моем представлении 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; 
} 

ответ

-1

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

+0

Я сделал scrollview размером, потому что мне нужно, чтобы пейджинг работал правильно. Если я увеличиваю ширину прокрутки до полной ширины, тогда она будет содержать всю ширину (вместо одного значка). Есть ли способ настроить местоположение поискового вызова программно? – spentak

0

Вы переопределили 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

У меня этот точный код в моем пользовательском классе scrollview, но кнопки никогда не получают событие. – spentak

6

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

- (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

Я пытался сделать то же самое, и это отлично сработало для меня. Благодарю. – ultrafez

0

Смотрите раздел ОБНАРУЖЕНИЯ штрихи Вне Scroll View в учебнике Matt Галлоуэй How To Use UIScrollView to Scroll and Zoom Content -

Вы делаете вид прокрутки меньше экрана и с зажимом подвиды непроверенных:

Xcode screenshot

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

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent*)event { 
    UIView *view = [super hitTest:point withEvent:event]; 
    if (view == self) { 
     return _scrollView; 
    } 
    return view; 
} 
Смежные вопросы