Пожалуйста, кто-нибудь может помочь разобраться с нубом? Я разместил эту проблему на различных форумах и не получил ответов, в то время как многие поиски других ответов вызвали stackOverflow, поэтому я надеюсь, что это именно то место.
У меня есть BeachView.h (подкласс UIScrollView, изображение песчаного пляжа) со случайным числом Stone.h (подкласс UIImageView, случайный PNG камня, userInteractionEnabled = YES для принятия касаний) .
Если пользователь касается и движется по пляжу, он должен прокручиваться.
Если пользователь касается камня, он должен вызвать метод "touchedStone".
Если пользователь нажимает на пляж, где нет камня, он должен вызвать метод "touchedBeach".
Теперь я понимаю, что это звучит очень просто. Все и все говорят мне, что если в UIScrollView есть что-то, что принимает прикосновения, то оно должно передать ему управление. Поэтому, когда я касаюсь и перетаскиваю, он должен прокручиваться; но если я постучу, и он на камне, он должен игнорировать пляжные постукивания и принимать каменные постукивания, да?
Однако, похоже, что оба представления принимают нажатие и вызывают оба элемента touchedStone И touchedBeach. Кроме того, сначала происходит нажатие на пляж, поэтому я даже не могу вставить флаг типа «если touchchedStone, то не запускать touchedBeach».
Вот некоторый код.
На BeachView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (self.decelerating) { didScroll = YES; }
else { didScroll = NO; }
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:touch.view];
NSLog(@"touched beach = %@", [touch view]);
lastTouch = touchLocation;
[super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
didScroll = YES;
[super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
if (didScroll == NO && isPaused == NO) {
[self touchedBeach:YES location:lastTouch];
}
[super touchesEnded:touches withEvent:event];
}
On Stone.m
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[parent stoneWasTouched]; // parent = ivar pointing from stone to beachview
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:touch.view];
NSLog(@"touched stone = %@", [touch view]);
[parent touchedStone:YES location:touchLocation];
}
После каменного постукивания My NSLog выглядит так:
Touched beach = <BeachView: 0x1276a0>
ran touchedBeach
Touched Stone = <Stone: 0x1480c0>
ran touchedStone
Так что на самом деле работает оба. Что еще более странно, если я возьму touchesBegan и touchesEnded из Stone.m, но оставлю userInteractionEnabled = YES, beachView регистрирует оба касания сам, но возвращает Stone как вид, которого он коснулся (второй раз).
Touched beach = <BeachView: 0x1276a0>
ran touchedBeach
Touched beach = <Stone: 0x1480c0>
ran touchedBeach
Итак, ПОЖАЛУЙСТА, я пытался разобраться в этом в течение нескольких дней. Как сделать так, чтобы звонки по касанию только касались Камня и звонки по касанию только касались пляжа? Куда я иду не так?