Я уверен, что эта проблема будет легко решена, однако я относительно новичок в разработке iOS. Я пытаюсь обработать передачу событий касания дочерним элементам, которые находятся ниже в порядке отрисовки в UIView. Например-
Я создаю расширенный UIImageView для создания моего класса MoveableImage. Этот класс в основном представляет собой UIImageView, который реализует touchesBegan, touchesEnded и touchesMoved -
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[self showFrame];
//if multitouch dont move
if([[event allTouches]count] > 1)
{
return;
}
UITouch *touch = [[event touchesForView:self] anyObject ];
// Animate the first touch
CGPoint colorPoint = [touch locationInView:self];
CGPoint touchPoint = [touch locationInView:self.superview];
//if color is alpha of 0, they are touching the frame and bubble to next responder
UIColor *color = [self colorOfPoint:colorPoint];
[color getRed:NULL green:NULL blue:NULL alpha:&touchBeganAlpha];
NSLog(@"alpha : %f",touchBeganAlpha);
if(touchBeganAlpha > 0)
{
[self animateFirstTouchAtPoint:touchPoint];
}
else {
[super.nextResponder touchesBegan:touches withEvent:event];
}
}
. Таким образом, конечный результат в основном такой: -Если они касаются фрейма imageView, а не изображения внутри другого изображения, которое будет под ним, они могут ответить. См. это изображение для примера.
До сих пор я пробовал следующий ответчик, однако это не решает проблему. Любая помощь будет принята с благодарностью!
Решено -Перестал проверять альфу на touchesBegan и touchesMoved. Ovveriding pointInside позволил UIView справиться с этим за меня.
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *) event
{
BOOL superResult = [super pointInside:point withEvent:event];
if(!superResult)
{
return superResult;
}
if(CGPointEqualToPoint(point, self.previousTouchPoint))
{
return self.previousTouchHitTestResponse;
}else{
self.previousTouchPoint = point;
}
BOOL response = NO;
//if image is nil then return yes and fall back to super
if(self.image == nil)
{
response = YES;
}
response = [self isAlphaVisibleAtPoint:point];
self.previousTouchHitTestResponse = response;
return response;
}