5

この問題は簡単に解決できると確信していますが、私は 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;





}
4

1 に答える 1

7

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)eventUIImageView のサブクラスの代わりにメソッドをオーバーライドできます。(各サブクラスがオーバーライドできるuiviewのメソッドです)

UIView は、このメソッドを使用して、hitTest:withEvent:どのサブビューがタッチ イベントを受け取るかを決定します。pointInside:withEvent: が YES を返す場合、サブビューの階層がトラバースされます。それ以外の場合、ビュー階層のブランチは無視されます。

OBShapedButtonの github でソース コードを確認します。これらは、ボタンの不透明な部分に対してのみタップ イベントを処理します。

于 2012-08-14T15:52:42.717 に答える