iPhone — UIView внутри UIScroller… просмотр, не передающий касания родительскому

#iphone

#iPhone

Вопрос:

У меня есть UIView (назовем его MyView) внутри UIScroller.

В MyView есть элементы, которые можно перетаскивать по нему.

При касании одного из этих элементов скроллер блокируется, чтобы предотвратить прокрутку всего объекта. Элементы имеют exclusiveTouch = ДА. Мне нужно, чтобы все это прокручивалось, когда затрагивается только MyView.

У меня это работало с touchesBegan, touchesMoved и т.д., Но я конвертирую этот класс в жесты. К новому классу привязаны два жеста: UIPanGestureRecognizer и UITapGestureRecognizer. Что-то вроде:

  UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] 
           initWithTarget:self action:@selector(drag:)];
 [panGesture setMaximumNumberOfTouches:1];
 [panGesture setDelegate:self];
 [myView addGestureRecognizer:panGesture];
 [panGesture release];


 UITapGestureRecognizer *singleTap =  [[UITapGestureRecognizer alloc] 
                initWithTarget:self 
                action:@selector(tapAdd:)];
 [singleTap setDelegate:self];
 [singleTap setNumberOfTapsRequired:1];
 [myView addGestureRecognizer:singleTap];
 [singleTap release];
  

Когда этот класс использовал старые методы (touchesBegan и т.д.), Я просто перенаправлял касания, используя что-то вроде

 [self.nextResponder touchesBegan: touches withEvent:event]; 
  

но как мне это сделать с помощью жестов? Я имею в виду, что UIPanGestureRecognizer, в моем случае, запустит метод, называемый drag: и этот метод получит жест… как мне перенаправить касание его родительскому скроллеру, чтобы все прокручивалось?

Спасибо

Ответ №1:

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

В вашем заголовке настройте

 @protocol MyViewDelegate
- (void)drag;
@end

@interface ....... {
    id <MyViewDelegate> delegate;
}
@property (nonatomic, assign) id delegate;
@end
  

Вам придется синтезировать delegate в файле реализации.
В классе scroller вам придется использовать протокол

 @interface Scroller ....... <MyViewDelegate> {
  

В этом файле реализации обязательно укажите myView.delegate = self; при его инициализации, добавьте - (void)drag { и делайте там то, что вы хотите. Если вам нужна дополнительная информация, вы, конечно, можете определить метод в вашем протоколе как нечто подобное - (void)dragWithEvent:(UIEvent *)event или что-то подобное.

Затем, когда вы вызываете drag: в MyView, вы можете перенаправить это в метод протокола, вызвав [self.delegate dragWithEvent:event]; .

Я понимаю, что это немного сложно для прокрутки вашего скроллера, но он перешлет сообщение так, как вы хотите.

Также возможно, что вы могли бы добавить жесты в скроллер, а не в MyView, затем перенаправить все касания в touchesBegan методе и позволить скроллеру обрабатывать это напрямую