この問題は簡単に解決できると確信していますが、私は iOS 開発に比較的慣れていません。UIView の描画順序が低い子にタッチ イベントを渡すことを処理しようとしています。例えば -
拡張 UIImageView を作成して、MoveableImage クラスを作成します。このクラスは基本的に、touchesBegan、touchesEnded、および touchesMoved を実装する UIImageView です。
-(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 のアルファのチェックを停止しました。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;
}