#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
методе и позволить скроллеру обрабатывать это напрямую