2012-12-20 11 views
8

私のUIViewオブジェクトの交差を検出することに問題があります。私は以下で使用しているものだ別のスーパービューで2つのUIViewオブジェクトの共通部分を検出する

は:交差点については

私は1つを変換する方法を理解する必要がある2つのオブジェクトは、別の座標系への最初のスーパービューからシステムを調整します。

私はこのアプローチを使用しました:- (CGRect)convertRect:(CGRect)rect fromView:(UIView *)viewここにはlinkと記載されています。

この方法を使用するのは非常に簡単です。しかし、異なるケースでは、ドキュメントの記述が少ししかないので難しいです(ただし、おそらく私にとって)。

これは、下の画像に示すサブビューの構造です。私はすでにドラッグアンドドロップオブジェクトのためのすべてのメソッドを持っています。しかし、私はどのようにUIViewAUIViewBの交差点を取得する必要があります。手伝ってくれてありがとう。

enter image description here

+0

階層を記述してもらえさらに詳細に? 1つのスーパービューにビューAとBの両方が含まれていますか? –

+0

あなたのイラスト – Till

+0

に遠近法のスキューを+1してください。スーパービューについては、AビューとBビューの2つの異なるスーパービューがあります。私がBビューをドラッグしているとき、Bビューが置かれているスーパービューに関連する座標だけが変化しています。ですから、B座標をAビューが置かれている座標に変換するには、UIViewクラスで宣言する多くのconvertRectメソッドの1つを使用する必要があります。この後、変換された座標とビューrectが交わる必要があります。非常に分かりやすいですが、このようなものを作るのは非常に単純ではありません) –

答えて

5

私は、このソリューションを実装している:

- (void)putComponent:(NSNotification *)notif { 
    // Catch B UIView. 
    UIView *view = [notif object]; 
    // Convertation. [self superview] - is view wher A UIView is placed. 
    CGRect convertedRect = [[self superview] convertRect:view.frame fromView:[view superview]]; 
    // Find center point. 
    CGPoint point; 
    point.x = convertedRect.origin.x + (convertedRect.size.width/2.0f); 
    point.y = convertedRect.origin.y + (convertedRect.size.height/2.0f); 
    // Find if CGRect (self.frame) contains a point (center of B UIView) 
    BOOL contains = CGRectContainsPoint(self.frame, point); 
    if (contains) { 
     NSLog(@"intersect here"); 
    } 
} 
+1

[CGGeometry']( 'https://developer.apple.com/library/mac/#documentation/ ')の' CGRectGetMidX'と 'CGRectGetMidY'関数をチェックしてください。 graphicsimaging/reference/CGGeometry/Reference/reference.htmlを参照してください)。 –

+0

実際に交差点をテストしたい場合は、1つの長方形の中心点**をテストするだけでは不十分です。 – Nate

+0

はい、そうです。すべてのアプローチには十分な解決策ではありません。お互いの隣に位置する多くのオブジェクト(ビュー)があるため、私はオブジェクトの中心点を使用しています。 Bビューを別のビューにドラッグすると、Bオブジェクトの中心点があるビューと交差する必要があります。したがって、Aビューの下にCビューもあり、これらのビュー(AとC)の1つのみの交差点を検出する必要があると仮定すると、この場合、使用するとビューの1つに交差する中心点が使用されますそれらのうちの2つを交差するBビューのrect。 –

0

私は、これはあなたの答えのコードと同等だと思うが、かなり短い:

- (void)putComponent:(NSNotification *)note { 
    UIView *other = note.object; 
    CGPoint otherCenterInMe = [self convertPoint:other.center fromView:other.superview]; 
    if ([self pointInside:otherCenterInMe withEvent:nil]) { 
     NSLog(@"intersect here"); 
    } 
} 
+0

私はポスターの答えが同じことを知っていますが、一般に、ある矩形の中心を別の矩形の中心でテストすることは有効な交差点テストではありません。 – Nate

関連する問題