2010-09-09 24 views
9

Trong một lớp con của UIView Tôi có điều này:iphone - xác định xem cảm ứng xảy ra trong subview của một UIView

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
    { 
     if(touch occurred in a subview){ 
     return YES; 
     } 

     return NO; 
    } 

tôi có thể làm gì để trong câu lệnh if? Tôi muốn phát hiện nếu một liên lạc xảy ra trong một subview, bất kể có hay không nằm trong khung của UIView.

Trả lời

2
-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([self hitTest:point withEvent:nil] == yourSubclass) 
} 

Phương pháp - (UIView *) hitTest: (CGPoint) chỉ withEvent: (UIEvent *) sự kiện trả về hậu duệ xa nhất của người nhận trong hệ thống phân cấp view (bao gồm cả bản thân) có chứa một điểm xác định. Những gì tôi đã làm ở đó là trả lại kết quả của việc so sánh chế độ xem xa nhất với chế độ xem con của bạn. Nếu subview của bạn cũng có subviews thì điều này có thể không hiệu quả với bạn. Vì vậy, những gì bạn muốn làm trong trường hợp đó là:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    return ([[self hitTest:point withEvent:nil] isDescendantOfView:yourSubclass]) 
} 
+0

Nhưng phương pháp này là một lớp con của UIView, vì vậy đây tai nạn: – sol

+0

xin lỗi, tôi đoán tôi cần phải thêm một câu trả lời để giải thích - xem bên dưới – sol

0

Nhưng phương pháp này là trong một lớp con của UIView, vì vậy đây bị treo:

return ([[self hitTest:point withEvent:nil] isDescendantOfView:self]) 

Có lẽ vì đệ quy vô hạn.

Tôi cố gắng này:

NSSet* touches = [event allTouches]; 
UITouch* touch = [touches anyObject]; 

return ([touch.view isDescendantOfView:self] || touch.view == self); 

Nhưng nó luôn luôn trả NO

+0

Điều này đã làm việc cho tôi trong lớp con UIView: - (void) touchesBegan: (NSSet *) chạm với sự kiệnEvent: (UIEvent *) { \t \t UITouch * touch = [chạm vào bất kỳObject] nào; \t nếu ([touch.view isDescendantOfView: mySubView]) { \t \t NSLog (@ "YUP"); \t} \t else { \t \t NSLog (@ "NOPE"); \t} } –

+0

điều này không phát hiện các chạm bên ngoài khung của khung nhìn - đó là phần quan trọng nhất mà tôi đang tìm kiếm. – sol

12

Hãy thử rằng:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    return CGRectContainsPoint(subview.frame, point); 
} 

Nếu bạn muốn quay trở lại YES nếu chạm vào bên trong xem nơi bạn thực hiện phương pháp này, sử dụng mã này: (trong trường hợp bạn muốn thêm công cụ nhận dạng cử chỉ vào một chế độ xem con nằm bên ngoài giới hạn của vùng chứa)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if ([super pointInside:point withEvent:event]) 
    { 
     return YES; 
    } 
    else 
    { 
     return CGRectContainsPoint(subview.frame, point); 
    } 
} 
1

TRY NÀY:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    if([touch.view isKindOfClass:[self class]]) { 
    return YES; 
    } 
    return NO; 
} 
0

Swift phiên bản:

var yourSubview: UIView! 

    override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool { 
    return subviewAtPoint(point) == yourSubview 
    } 

    private func subviewAtPoint(point: CGPoint) -> UIView? { 
    for subview in subviews { 
     let view = subview.hitTest(point, withEvent: nil) 
     if view != nil { 
     return view 
     } 
    } 
    return nil 
    } 
Các vấn đề liên quan