2012-06-27 34 views
16

Tôi hiện đang sử dụng UIScrollView để hoạt động như một cách cuộn/kéo con trỏ/điểm đánh dấu của biểu đồ mà tôi đang hiển thị trên ứng dụng của mình. Tôi sử dụng scrollViewDidScroll, vv để phát hiện vị trí của contentoffset và thao tác những gì tôi hiển thị trên màn hình dựa trên vị trí này.ios là có thể cho một uiscrollview để phát hiện một vòi duy nhất bởi một người sử dụng trong khi vẫn cung cấp khả năng kéo, di chuyển của nó?

Câu hỏi của tôi là nếu có thể phát hiện một lần nhấn của người dùng trên màn hình và nhận vị trí của vòi này (sau đó đặt thiết lập nội dung cho vị trí này)?

Tôi đã đọc một số hướng dẫn mô tả việc tạo lớp con của chế độ xem trước, nhưng có vẻ như các lớp con này sẽ CHỈ chỉ tính cho một lần nhấn và không cũng kéo/cuộn.

Có ai có bất kỳ thông tin chi tiết nào về cách tôi có thể phát hiện một lần nhấn duy nhất của người dùng trên UIScrollView của tôi trong khi vẫn có khả năng cuộn/kéo?
Cảm ơn bạn trước!

+0

thực hành chung cho UIScrollViews là không gây rối với những cách người dùng tương tác với họ. Apple đã tạo ra chúng vì chúng là vì một lý do - bạn muốn có hành vi khác nhau, tạo ra quan điểm của riêng bạn. Ngoài ra, mặc dù, tôi không thực sự rõ ràng về lý do bạn muốn phát hiện vòi nước. Người dùng sẽ nhấn vào bên trong scrollview, và bạn nói sau đó bạn sẽ đặt contentOffset ở vị trí tap, nhưng contentOffset mô tả góc trên bên trái của nội dung có thể xem được bên trong scrollview, vậy ... Ý bạn là gì? – WendiKidd

+0

có bởi vì contentoffset là cách tôi xác định nơi cuộn "là" trên màn hình. Nói cách khác, contentoffset giống như một điểm đánh dấu cho khoảng cách mà người dùng cuộn xuống. Vì vậy, tôi thay đổi văn bản của nhãn dựa trên vị trí của scrollview hay còn gọi là contentoffset._Vì vậy, tôi muốn người dùng nhấn để thiết lập/cập nhật contentoffset dựa trên nơi người dùng chạm vào scrollview_ –

Trả lời

30

Sử dụng đoạn mã sau cho đối tượng scrollview của bạn:

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)]; 
singleTapGestureRecognizer.numberOfTapsRequired = 1; 
singleTapGestureRecognizer.enabled = YES; 
singleTapGestureRecognizer.cancelsTouchesInView = NO; 
[scrollView addGestureRecognizer:singleTapGestureRecognizer]; 
//[singleTapGestureRecognizer release]; Not needed in ARC-enabled Project 

}

- (void)singleTap:(UITapGestureRecognizer *)gesture { 
//handle taps 
} 
+0

haha, this là chính xác (tốt, gần như chính xác) các giải pháp tôi đã đưa ra! nhưng cảm ơn bạn anyways !! –

+0

Thực ra bạn chỉ cần đặt cancelsTouchesInView là numberOfTapsRequired và được bật được đặt thành 1 và YES theo mặc định: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizer_Class/ – dnlcrl

+0

Ngày nay bạn có thể tạo UITapGestureRecognizer trong bảng phân cảnh và kéo một hành động cho mã ngắn hơn nhiều. –

0

Bạn đã xem xét đính kèm UITapGestureRecognizer vào scrollView chưa? Tôi đã đính kèm UITapGestureRecognizer vào UIScrollView và sử dụng –gestureRecognizerShouldBegin: và/hoặc –gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: để hủy chế độ quét được tích hợp khi cần.

1

Phần đầu tiên của câu hỏi khá đơn giản để bắt đầu. Nếu bạn có một lớp con UIScrollView, bạn chỉ có thể thêm một ghi đè touchesEnded trông như thế này:

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 

    if ([touch tapCount] == 1) { 

     CGPoint location = [touch locationInView:self]; 

     [self setContentOffset:location animated:YES]; 

    } 


} 

Trong trường hợp xem di chuyển, các -locationInView cho các liên lạc sẽ thực sự đã có ContentOffset thêm vào nó. Mã này sẽ làm gì là cuộn chế độ xem cuộn để điểm mà người dùng chạm vào ở trên cùng bên trái của chế độ xem. Điều này có lẽ không phải là những gì bạn muốn chính xác, vì vậy bạn sẽ phải làm những việc như thêm vào một bù đắp nếu bạn muốn cuộn để kết thúc 10 pixel trong, hoặc bạn muốn thực hiện một CGPoint chỉ với giá trị x ra khỏi vị trí nếu cuộn của bạn không phải là trái sang phải.

Điều này sẽ không ảnh hưởng đến việc có thể thực sự cuộn.

+0

điều này thật tuyệt vời cho những lần mà UIGestureRecognizer sẽ không thực hiện (phần lớn thời gian cho tôi có vẻ như vậy!) –

6

Swift 3

let scrollViewTapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(scrollViewTapped(_:))) 
scrollViewTapGestureRecognizer.numberOfTapsRequired = 1 
scrollViewTapGestureRecognizer.isEnabled = true 
scrollViewTapGestureRecognizer.cancelsTouchesInView = false 
scrollView.addGestureRecognizer(scrollViewTapGestureRecognizer) 

func scrollViewTapped(_ sender: UITapGestureRecognizer) { 
    print("UIScrollView was tapped.") 
}