1. ホーム
  2. ios

[解決済み] 透明なUIViewの後ろでボタンをクリックするにはどうしたらいいですか?

2022-04-19 16:08:48

質問

例えば、1つのサブビューを持つビューコントローラがあるとします。サブビューは画面の中央を占め、すべての側面に100pxの余白があります。そして、そのサブビューの中にクリックするための小さなものをたくさん追加します。新しいフレームを利用するためにサブビューを使用しているだけです(サブビュー内の x=0, y=0 は、実際には親ビューの 100,100 になります)。

次に、サブビューの背後にメニューのようなものがあると想像してください。ユーザーがサブビューの中の小さなものを選択できるようにしたいのですが、そこに何もない場合は、タッチがサブビューを通過して(背景が透明なので)その後ろのボタンに移動するようにしたいのです。

どうすればいいのでしょうか?touchesBeganは通っているように見えますが、ボタンは機能しません。

どうすればいいですか?

コンテナ用のカスタムビューを作成し、以下のように、ポイントが適格な子ビュー内にない場合に false を返すように pointInside: メッセージをオーバーライドします。

Swiftです。

class PassThroughView: UIView {
    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
        for subview in subviews {
            if !subview.isHidden && subview.isUserInteractionEnabled && subview.point(inside: convert(point, to: subview), with: event) {
                return true
            }
        }
        return false
    }
}

Objective Cです。

@interface PassthroughView : UIView
@end

@implementation PassthroughView
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    for (UIView *view in self.subviews) {
        if (!view.hidden && view.userInteractionEnabled && [view pointInside:[self convertPoint:point toView:view] withEvent:event])
            return YES;
    }
    return NO;
}
@end

このビューをコンテナとして使用すると、その子のどれもがタッチを受け取ることができますが、ビュー自体はイベントに対して透過的になります。