2014-05-06 17 views
9

Tôi có thiết lập sau.Làm thế nào để vượt qua sự kiện cảm ứng để giám sát khi userInteractionEnabled = YES?

+- XXXCustomControl : UIControl -------+ 
| A         | 
| +- ContentView -------------------+| 
| |         || 
| | B        || 
| |         || 
| +---------------------------------+| 
+--------------------------------------+ 

XXXCustomControl là phân lớp của UIControl. Nó chứa một subview được gọi là contentView loại UIView với kích thước đó là nhỏ hơn so với khu vực kiểm soát .. View đó có .userInteractionEnabled = YES;

Tôi cần thuộc tính đó để được đặt thành CÓ, bởi vì các cuộn cuộn ngang được đặt bên trong này một lần trong một thời gian và chúng cần phải cuộn được. Nếu người giám sát (trong trường hợp xem nội dung của chúng tôi sẽ không cho phép tương tác người dùng, điều này được thừa hưởng y các bản xem trước.) Nhưng đồng thời XXXCustomControl này cần phải được nhấn khi không chứa scrollview trong chế độ xem nội dung không chỉ trong khu vực A cũng trong khu vực B.

vì vậy, tôi có một "mâu thuẫn về lợi ích" ở đây vì tôi hoặc là

1) thiết lập các quan điểm nội dung để userInteractionEnabled = NO, sau đó tôi có thể khai thác sự kiểm soát trống trong khu vực xem nội dung cả trong A và B, nhưng các cuộn cuộn tôi sẽ đặt ở đó sẽ không cuộn được ..

2) đặt chế độ xem nội dung thành userInteractionEnabled = YES nhưng sau đó, nếu nút Điều khiển trống, Tôi chỉ có thể chạm vào vùng A để kích hoạt sự kiện chạm.

Một ý tưởng tôi đưa ra là tôi đặt thuộc tính thành NO theo mặc định và khi tôi điền contentView, tôi đặt nó thành có. khi tôi xóa contentView, tôi đặt thuộc tính trở về không. Về cơ bản, tôi muốn điều này được đặt thành có mọi lúc và khi nó trống, hãy buộc contentView chuyển sự kiện touchUpInside lên tới người giám sát của nó.

Điều này có khả thi không?

+1

Nếu bạn chỉ quan tâm đến vòi nước tại sao không thêm một gesturerecognizer đến xem con đó là hành động giống như gesturerecognizer trong chế độ xem gốc? Điều đó có vẻ như việc thực hiện dễ nhất. – Putz1103

+0

Tại sao bạn không nhận được câu trả lời? michaels làm việc cho tôi ... –

+0

Tốt hơn không bao giờ ... –

Trả lời

13

Bạn có thể thử ghi đè phương pháp pointInside:withEvent: ở chế độ xem bên trong của mình. Điều này sẽ cho phép bạn trở NO khi bạn muốn chuyển tiếp chạm đến SuperView:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    if(/* You have content, and you want to receive touches */){ 
     return YES; 
    }else{ 
     return NO; 
    } 
} 
+0

Điều này cũng hoạt động tốt cho chế độ xem có trong chế độ xem vùng chứa - để cho phép một số điều khiển tồn tại trong chế độ xem vùng chứa (siêu). Chỉ cần tương tác thông qua các khung hình subview - nếu không có hit sau đó trở về NO –

3

Bạn có thể phân lớp subview của bạn, và thực hiện

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (!touchedContent) { 
     [[self nextResponder] touchesBegan:touches withEvent:event]; 
    } else { 
     [super touchesBegan:touches withEvent:event]; 
    } 
} 
0

Bạn có thể sử dụng UIView khác để "ẩn" subview .

* Chi tiết: UIView này là anh chị em của người xem. nó có cùng kích thước và vị trí của subview của bạn với màu nền của màu sắc rõ ràng.

* Giải thích: UIView mới sẽ liên lạc và tự động chuyển nó cho người giám sát.

Cách này không cần phải phân lớp tiểu sử của bạn - đó là giải pháp bảng phân cảnh.
Hãy thử điều này. Chúc vui vẻ!

0

Sử dụng này trong siêu xem, mà không thay đổi subviews mã (kể từ subviews thể được giới thiệu từ các khuôn khổ khác hoặc vỏ):

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView *view = [super hitTest:point withEvent:event]; 
    if ([view isDescendantOfView:self]) 
    { 
     NSLog(@"touched inside"); 
    } 
    return view; 
} 
Các vấn đề liên quan