1. ホーム
  2. iphone

[解決済み] UIViewの枠を超えたインタラクション

2023-01-12 06:48:28

質問

UIButton のフレームが親のフレームの外にあるとき、UIButton (または他のコントロール) がタッチ イベントを受け取ることは可能ですか。これを試すと、UIButtonはイベントを受信できないようです。これを回避するにはどうすればよいですか?

どのように解決するのですか?

はい。 hitTest:withEvent: メソッドをオーバーライドして、そのビューが含むより大きな点の集合のビューを返すことができます。詳細は UIView クラスリファレンス .

編集してください。

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGFloat radius = 100.0;
    CGRect frame = CGRectMake(-radius, -radius,
                              self.frame.size.width + radius,
                              self.frame.size.height + radius);

    if (CGRectContainsPoint(frame, point)) {
        return self;
    }
    return nil;
}

2を編集します。 (明確化後:) ボタンが親の境界内にあるものとして扱われるようにするために、オーバーライドする必要があります。 pointInside:withEvent: をオーバーライドする必要があります。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(self.view.bounds, point) ||
        CGRectContainsPoint(button.view.frame, point))
    {
        return YES;
    }
    return NO;
}

注意 pointInsideをオーバーライドするためのコードが正しくありません。以下のSummonの説明のように、こうしてください。

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
    if ( CGRectContainsPoint(self.oversizeButton.frame, point) )
        return YES;

    return [super pointInside:point withEvent:event];
    }

を使う可能性が非常に高いことに注意してください。 self.oversizeButton をこの UIView サブクラスの IBOutlet として使用することになるでしょう。そうすれば、問題の "oversize button" を、問題の特別なビューにドラッグするだけです。(または、何らかの理由でプロジェクトでこれをたくさん行っている場合、特別なUIButtonサブクラスがあり、それらのクラスのサブビューリストを調べることができます)。お役に立てれば幸いです。