2012-12-20 23 views
8

Tôi gặp sự cố khi phát hiện giao điểm của các đối tượng UIView của tôi.Phát hiện giao điểm của hai đối tượng UIView tại các góc nhìn khác nhau

Đó là những gì tôi đã sử dụng dưới đây:

Đối với giao hai đối tượng tôi cần phải tìm ra cách để dịch một phối hệ thống từ SuperView đầu tiên một hệ thống tọa độ.

Tôi đã sử dụng phương pháp này: - (CGRect)convertRect:(CGRect)rect fromView:(UIView *)view được mô tả ở đây link.

Như tôi biết rất dễ sử dụng phương pháp này. Nhưng trong các trường hợp khác nhau, thật khó do một chút mô tả trong tài liệu (nhưng có lẽ chỉ dành cho tôi).

Đây là cấu trúc của các bản xem phụ được hiển thị trên hình ảnh bên dưới. Tôi đã có tất cả các phương thức cho đối tượng kéo và thả. Nhưng tôi cần tìm ra cách để có giao lộ cho UIViewAUIViewB. Cảm ơn vì sự giúp đỡ.

enter image description here

+0

thể bạn hãy mô tả hệ thống phân cấp chi tiết hơn? Có một giám sát duy nhất chứa cả hai lượt xem A và B không? –

+0

+1 cho góc nhìn nghiêng về hình minh họa của bạn – Till

+0

cảm ơn các bạn đã phản hồi. về giám sát - có hai giám sát khác nhau cho lượt xem A và B. Khi tôi kéo B xem các tọa độ đang thay đổi chỉ liên quan đến superview nơi đặt B view. Vì vậy, để dịch B tọa độ để tọa độ nơi A xem được đặt tôi cần phải sử dụng một trong nhiều phương pháp convertRect khai báo trong lớp UIView, sau này tôi cần phải nhận được giao với coords chuyển đổi và A xem rect. Rất đơn giản để hiểu, nhưng không phải là rất đơn giản để làm cho công cụ này) –

Trả lời

5

tôi đã thực hiện giải pháp này:

- (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

Kiểm tra các chức năng 'CGRectGetMidX' và' CGRectGetMidY' trong ['CGGeometry'] (https://developer.apple.com/library/mac/#documentation/ graphicimaging/reference/CGGeometry/Reference/reference.html). –

+0

Nếu bạn thực sự muốn kiểm tra giao lộ, không đủ để kiểm tra ** tâm ** của một hình chữ nhật. – Nate

+0

Có, bạn đã đúng. Nó không đủ giải pháp cho tất cả các phương pháp tiếp cận. Tôi sử dụng các điểm trung tâm của đối tượng của mình vì tôi có nhiều đối tượng (các khung nhìn) nằm cạnh nhau. Vì vậy, nếu tôi kéo chế độ xem B sang chế độ xem khác, tôi cần phải giao cắt nó với chế độ xem nơi các điểm trung tâm của đối tượng B nằm. Vì vậy, nếu chúng tôi giả sử rằng dưới chế độ xem A, chúng tôi cũng có một chế độ xem C khác và tôi cần phát hiện giao lộ chỉ cho một trong các chế độ xem này (A và C) vì vậy trong trường hợp này tôi sử dụng điểm trung tâm sẽ giao cắt chỉ một trong các chế độ xem thay thế nếu tôi sử dụng rect của B xem có thể giao nhau hai trong số chúng. –

0

Tôi nghĩ rằng đây là tương đương với các mã trong câu trả lời của bạn, nhưng đáng kể ngắn:

- (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

Tôi biết câu trả lời của người đăng cũng làm điều tương tự, nhưng nói chung, việc kiểm tra trung tâm của một hình chữ nhật ở một hình khác không phải là một bài kiểm tra giao lộ hợp lệ. – Nate

Các vấn đề liên quan