2011-10-27 38 views
6

thể trùng lặp:
UIScrollview getting touch eventsiPhone - UIScrollView ... phát hiện tọa độ của một liên lạc

Có thể phát hiện nơi trong một UIScrollView ngón tay chạm vào?

Ý tôi là, giả sử người dùng sử dụng ngón tay theo cách này: chạm và cuộn, nhấc ngón tay lên và một lần nữa, chạm và cuộn, v.v. Có thể biết CGPoint nơi các vòi nước xảy ra liên quan đến bản thân. xem scroller là trong? Các cuộn chiếm toàn bộ self.view.

Cảm ơn.

Trả lời

12

Bạn có thể làm điều đó với trình nhận dạng cử chỉ. Đối với phát hiện đơn vị trí vòi sử dụng UITapGestureRecognizer

UITapGestureRecognizer *tapRecognizer = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)] autorelease]; 
[myScrollView addGestureRecognizer:tapRecognizer]; 

- (void)tapAction:(UITapGestureRecognizer*)sender{ 
    CGPoint tapPoint = [sender locationInView:myScrollView]; 
    CGPoint tapPointInView = [myScrollView convertPoint:tapPoint toView:self.view]; 
} 

Để chuyển đổi mà tapPoint để self.view bạn có thể sử dụng phương pháp convertPoint:toView: trong lớp UIView

+0

không. tapAction chỉ được kích hoạt nếu tôi chạm và không cuộn. Nếu tôi làm như tôi đã nói, hãy nhấn, cuộn, nhấc ngón tay, nhấn, cuộn, nhấc ngón tay, v.v., không có vòi nào được phát hiện. Không có vòi nào được phát hiện cũng nếu cuộn giấy cũng cuộn sau khi vuốt lớn. Cuộn giấy phải vẫn còn và một vòi khô phải được thực hiện, để làm việc này. – SpaceDog

+1

Có rất nhiều trình nhận dạng cử chỉ khác - UIPanGestureRecognizer, UIPinchGestureRecognizer, UISwipeGestureRecognizer, UIRotationGestureRecognizer. Hơn nữa, bạn có thể tạo trình nhận dạng tùy chỉnh để phát hiện các chạm rất phức tạp. Tôi đã đưa ra ví dụ phổ biến hơn với cảm ứng đơn giản. – beryllium

+0

@RubberDuck Bạn đã tìm ra điều này chưa? Tôi đang trên cùng một chiếc thuyền ... Tôi đang làm việc trên một UICollectionView, tôi muốn phát hiện nếu chạm ngón tay là trên xem tế bào –

0

Hãy xem touchesBegan:withEvent: Bạn sẽ nhận được một số NSSet UITouch's và UITouch chứa phương thức locationInView: sẽ trả về điểm CGPoint của liên lạc.

+0

Trong trường hợp này, bạn cần phải phân loại UIScrollView – beryllium

0
+0

không dễ dàng như vậy. TouchesBegan chỉ phát hiện một liên lạc nếu scrollview vẫn còn nếu nó đang di chuyển đã và tôi chạm vào nó, touchesBegan sẽ không phát hiện bất cứ điều gì. – SpaceDog

0

Bạn có thể tìm ra vị trí trong giao diện và thêm ofset cuộn với nó. Bây giờ, vấn đề tiếp theo của bạn là -(void)touchesBegan:touches:event sẽ không được gọi vì các sự kiện sẽ được gửi tới scrollview của bạn. Điều này có thể được cố định bằng cách phân lớp UIScrollView của bạn và có scrollview gửi các sự kiện cảm ứng tới phần trả lời tiếp theo (chế độ xem của bạn).

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    // Position of touch in view 
    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 

    // Scroll view offset 
    CGPoint offset = scrollView.contentOffset; 

    // Result 
    CGPoint scrollViewPoint = CGPointMake(touchPoint.x, touchPoint.y + offset.y); 
    NSLog(@"Touch position in scroll view: %f %f", scrollViewPoint.x, scrollViewPoint.y); 
} 
+0

không. touchesBegan chỉ được kích hoạt nếu tôi chạm và không cuộn. Nếu tôi làm như tôi đã nói, hãy nhấn, cuộn, nhấc ngón tay, nhấn, cuộn, nhấc ngón tay, v.v., không có vòi nào được phát hiện. Không có vòi nào được phát hiện cũng nếu cuộn giấy cũng cuộn sau khi vuốt lớn. Cuộn giấy phải vẫn còn và một vòi khô phải được thực hiện, để làm việc này. Nó không phải là dễ dàng như nó có vẻ. – SpaceDog

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