Мне нужно сделать что-то вроде этого:
UISCrollView с UIImageViews в качестве его подпредставлений.Когда пользователь нажимает на UIImageViews, происходит действие.Но когда пользователь хочет прокрутить, UIScrollView следует прокручивать, даже если прокрутка началась в UIImageView (в месте, где отображается UIImage UIImageView).
В основном я могу получить один из двух сценариев:
Я могу получить это, если пользователь нажимает на UIImageView (который является подпредставлением UIScrollView), действие происходит, но когда выпопробуйте прокрутить, перетаскивая палец из UIImageView, действие также происходит (и я хочу, чтобы прокрутка произошла).
Я могу сделать это относительно того, где пользователь нажимает на представление, прокручивается, но если пользователь касаетсяUIImageView действие НЕ произойдет.
Я не могу получить какой-либо свой код, потому что я тестирую много апрошей тут и там, и это немного грязно, так что это не будетиспользовать вообще (без тонны комментариев).
Есть ли чистое и простое решение для этого?
Хорошо, вот некоторый код:
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if(isDragging == NO)
{
return [super hitTest:point withEvent:event];
}
NSLog(@"dragging ><><><><><>>><><><><>");
return nil;
}
Теперь, если я верну ноль, тогда я могу прокрутить, но я могуне могу коснуться моего UIImageView для действия.Если я возвращаю [super hitTest: point withEvent: event], я не могу прокрутить свой UIIMageView.
isDragging - тестовый код, чтобы определить, пытаюсь ли я прокрутить или просто нажать.Но проверка попадания происходит до того, как я могу установить свойство isDragging в соответствии с происходящим событием.
Вот мой init
-(id) initWithCoder:(NSCoder *)aDecoder
{
if(self = [super initWithCoder:aDecoder])
{
[self setUserInteractionEnabled:YES];
UISwipeGestureRecognizer *swipeRecLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
swipeRecLeft.direction = UISwipeGestureRecognizerDirectionDown;
UISwipeGestureRecognizer *swipeRecRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe)];
swipeRecRight.direction = UISwipeGestureRecognizerDirectionUp;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapSingle)];
[self addGestureRecognizer:swipeRecRight];
[self addGestureRecognizer:swipeRecLeft];
[self addGestureRecognizer:singleTap];
[swipeRecLeft release];
[swipeRecRight release];
[singleTap release];
isDragging = NO;
}
else {
self = nil;
}
return self;
}
Вот остальные действия
-(void) tapSingle
{[self.delegate hitOccur];}
-(void) swipe
{
isDragging = YES;
}
И поверх этого в моем UIScrollView я установил делегат, и когда прокрутка заканчивается, я устанавливаю свойство isDragging вручную в NO для каждого подпредставления моего UIScrollView.
Это работает... но это не идеально.Чтобы на самом деле прокручивать контент, я должен провести ДВАЖДЫ в UIImageView (сначала нужно установить isDragging на YES, а затем мы можем прокрутить ...).Как правильно и правильно?
ПОСЛЕДНИЕ ОБНОВЛЕНИЯ:
Хорошо, мне удалось решить эту проблему.Однако я абсолютно уверен, что мой путь не чистый или хороший (но считает, что он работает).
В моем подклассе UIScrollView я переопределил метод hitTest с этим:
-(UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
if(!self.dragging)
{
if([[super hitTest:point withEvent:event] class] == [ResponsiveBookView class])
{
container = [super hitTest:point withEvent:event];
}
}
return self;
}
Где контейнер - это идентификатор контейнера, и он содержит мой подкласс UIView.Таким образом, я могу узнать, было ли касание на моем изображении или на самом просмотре прокрутки.Теперь мне нужно определить, прокручивается ли он или просто касается, и я делаю это здесь:
-(void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
if (!self.dragging) {
NSLog(@"touch touch touch");
[container tapSingle];
[self.nextResponder touchesEnded: touches withEvent:event];
}
[super touchesEnded: touches withEvent: event];
}
Как вы видите, будет ли применяться self.dragging (scrolling) поведение по умолчанию.Если! Self.dragging, я вручную вызову tapSingle для моего контейнера (что затем заставит действие «произойти»).Это работает!