2017-08-02 1 views
0

問題:viewWithGestureにはviewUserSeesが含まれており、青いコンテナビュー内でドラッグ可能です。しかし、viewWithGestureはcontainerViewのサブビューであるため、viewWithGestureが極端な場合(ここではcontainerViewの半分と半分に示されています)、viewWithGestureの半分だけがタッチに反応してドラッグするのが非常に難しくなります。UIView部分的に外側のsuperView受信待ちでない

注:コンテナ内に保持してコンテナビューの外に移動する数学をすべてやり直す必要があることはわかっていますが、これを「悪い」方法で行う方法を学ぶのは非常に興味があります。

私はこれを研究してhittest()とpointInside()を実装しようとしましたが、これまでは驚くほどアプリをクラッシュさせることができました。

ユーザーがコンテナビューの外側からグラブを取るようにするには、比較的クリーンな方法がありますか?

EDIT:緑色のボックスは透明で半分はコンテナビューにあり、半分は透明ではありません。

stupid problem

+0

左側の緑色の矩形は何ですか? –

+0

これは、containerViewの外側にあるviewWithGestureの半分です。透明性を使用しているので、私はそれを見ていることを説明するのがとても暑いですね。 – solenoid

答えて

2

タッチを受信するビューためには、ビューとそのすべての祖先はpointInside:withEvent:からtrueを返さなければなりません。

通常、ポイントがビューの境界外にある場合はpointInside:withEvent:がfalseを返します。緑色の領域のタッチがコンテナビューの境界の外側にあるため、コンテナビューはfalseを返し、タッチはジェスチャビューに当たらない。

これを修正するには、コンテナビューのサブクラスを作成し、pointInside:withEvent:を上書きする必要があります。オーバーライドでは、ポイントがコンテナビューの境界内またはジェスチャビューの境界内にある場合はtrueを返します。もしあなたのコンテナビューが多くのサブビューを持たない場合は特に怠惰かもしれません。ポイントがサブビューの境界にある場合はtrueを返します。

class ContainerView: UIView { 

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool { 
     if super.point(inside: point, with: event) { return true } 
     for subview in subviews { 
      let subviewPoint = subview.convert(point, from: self) 
      if subview.point(inside: subviewPoint, with: event) { return true } 
     } 
     return false 
    } 

} 
+0

これはまさにhittest()がトラップだったようですが、これは驚くほどきれいです。良い解説もありがとうございました。これに対する他の以前の答えは、うまくいったことの論争にあるようでした。 – solenoid

関連する問題