2010-12-12 4 views
5

を使用して、そのスーパービューに対して画面上でaSubviewの位置を移動します。スーパービューはサブビュー自体よりもはるかに大きくありません。これは、次のスニペットとして行うことは非常に簡単であることを示している。しかしaSubviewが移動されるとtouchesBeganは、ビューがスーパービューの外に移動したときに動作を停止します。

UITouch* touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:[self superview]]; 
    self.center = touchPoint; 

、とすぐにそれのいずれかの部分がそのスーパービューの境界外にあるとして、登録もはやそのセクションで触れていません。言い換えれば、touchesBeganはもはや発砲しない。私はaSubviewに触れて、スーパービューに関連してどこに移動しても登録したいと思っています。

どのような考えですか?
ハワード

答えて

0

これが正しい方法であるかどうかは確信していますが、それは確かに一つの方法です。

あなたの親オブジェクトの中でさえ、ビーガンを聞く。 イベントを受け取った場合は、touchesBeganを呼び出すことによって、イベントを子ビューに渡します。

+0

私はそれを行うことを好まない、私はヒットが子供のビューであったか否かを判断する方法を把握する必要があると思いますので、(それは明らかに難しいことではありませんが、私はそれをする必要はありません)。実際にはそれより少し悪いです。私はいくつかの子どもの意見を持っていて、どれが当たったのかを判断する必要があります。それは私が必要ではないと思う合併症を増やします - 私がなぜ今働いていないのか理解できれば。 – hkatz

1

Appleのエンジニアにこれについてお話しました。 touchesBeganは、スーパービュー内に含まれていないサブビューの部分では機能しません。これは、各サブビューが呼び出されるサブビューを決定しようとするときに、各サブビューを階層下にクリップするためです。

問題を解決するために、クリッピング問題の原因となっていた中間ラッパービューを削除し、サブビューを1つ上に上げました。これはロジックの軽微な変更を必要としましたが、最終的にはよりクリーンなソリューションであることが証明されました。

2

スーパービューが単にその境界の外にあるサブビューのタッチイベントを送信していないため、サブビューが入力を受け取らないという問題がありました。また、スーパービューの境界をそのまま維持し、サブビューを階層の上に移動することも実現不可能であった。何が私の仕事がスーパービューのオーバーライドだったのですか?

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 

常にYESを返すようにしました。結果:スーパービューでもサブビューでもほとんど何も変わらなかったが、入力はスーパービューの境界の外で受け取られた。

5

mcpunkyさんの答えは、あなたができることを除いてほぼ同じです。NOTpointInsideは常にYESを返すように機能します。このようにして、ビューはすべての接触を傍受します。

代わりに、人はより細かなチェックを実行する必要があります。

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ 

    return CGRectContainsPoint(self.subviewOutsideMe.frame, point) || CGRectContainsPoint(self.bounds, point); 

} 
+0

あなたのケースによっては、 'pointInside'の代わりに' - (UIView *)hitTest:(CGPoint)point withEvent :(UIEvent *)event'をオーバーライドすることも考えられます –

+0

pointInside:ビューのサブビューが外にある場合に呼び出されませんしかし、スーパービューの境界です。右? – Remover

関連する問題