0

私には見解があり、プログラムで描かれた円があります。また、ジェスチャ認識機能があり、デリゲートがタッチを受け取る必要があるかどうかを確認します(この円をタップした場合はそうする必要があります)。

- (void)awakeFromNib
{
    [super awakeFromNib];

    circleTapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(toggleHighlighted:)];
    [self addGestureRecognizer:circleTapRecognizer];
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    CGPoint hit = [touch locationInView:self];

    if (gestureRecognizer == circleTapRecognizer) {
        BOOL hitsCircle = hit.x >= CGRectGetMidX(self.bounds) - self.circleRadius &&
                          hit.x <= CGRectGetMidX(self.bounds) + self.circleRadius &&
                          hit.y >= CGRectGetMidY(self.bounds) - self.circleRadius &&
                          hit.y <= CGRectGetMidY(self.bounds) + self.circleRadius;

        return hitsCircle;
    }

    return YES;
}

しかし、この円の外側のスペースをタップした場合は、スーパービューにタッチを与えたいと思います。これどうやってするの?確かに、superviewのロジックを呼び出すという名前のデリゲートメソッド呼び出しを行うことはできますtappedNotOnCircleが、もっと簡単な方法があるのではないかと思います。

4

1 に答える 1

1

GestureRecognizer を使わない解決策があります。-(BOOL)[UIView pointInside:(CGPoint)point withEvent:(UIEvent *)event]をオーバーライドするだけです。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL hitsCircle = hit.x >= CGRectGetMidX(self.bounds) - self.circleRadius &&
                      hit.x <= CGRectGetMidX(self.bounds) + self.circleRadius &&
                      hit.y >= CGRectGetMidY(self.bounds) - self.circleRadius &&
                      hit.y <= CGRectGetMidY(self.bounds) + self.circleRadius;

    return hitsCircle;
}

理解を深めるには、Apple ドキュメントのカスタム ビューの定義を参照してください。

于 2013-03-04T14:51:41.153 に答える