2012-06-12 17 views
10

Tôi có UISlider (dọc) bên trong UIScrollview. Tôi muốn có thể thay đổi giá trị của thanh trượt và không cần nhấc ngón tay lên, cuộn thanh cuộn sang trái hoặc phải.Chạm vào UISlider ngăn cản việc cuộn UIScrollView

hành vi mong muốn:

cảm ứng xuống bên UISlider dọc, theo sau là một kéo ngón tay sang trái hoặc phải làm cho scrollview để di chuyển

hành vi thực tế:

cảm ứng xuống bên UISlider dọc , theo sau là một ngón tay kéo sang trái hoặc phải sẽ không gây ra chuyển động nào trong UIScrollview. Một chạm xuống bên ngoài UISlider theo sau là thao tác kéo sẽ cuộn scrollview như mong đợi

UIView có thuộc tính được gọi là exclusiveTouch có vẻ như có thể liên quan đến vấn đề của tôi. Tôi đã thử đặt nó thành NO, không có may mắn.

Vì vậy, làm thế nào có thể thiết lập UISliders của tôi để cuộn xuống bên dưới chúng sẽ phản ứng lại các lần chạm có nguồn gốc bên trong UISliders?

+5

+1 cho kết quả mong muốn/mong đợi so với kết quả thực tế. Câu hỏi khác nên làm điều này. –

Trả lời

4

Bạn đã thử phân lớp UIScrollView và triển khai - (BOOL)touchesShouldCancelInContentView:(UIView *)view?Theo tài liệu của Apple:

// called before scrolling begins if touches have already been delivered to a subview of the scroll view. if it returns NO the touches will continue to be delivered to the subview and scrolling will not occur 
// not called if canCancelContentTouches is NO. default returns YES if view isn't a UIControl 

Nếu bạn chỉ đơn giản là trở NO nếu viewUISlider của bạn, thể này làm những gì bạn muốn, giả sử UIScrollView chỉ cuộn của bạn theo chiều ngang. Nếu cách này không hiệu quả, bạn có thể phải thực hiện xử lý chạm tùy chỉnh (nghĩa là ghi đè touchesBegan:withEvent:, touchesChanged:withEvent:, v.v.) cho cả số UIScrollViewUISlider của bạn.

+0

Bí quyết. Cảm ơn! – morgancodes

2

Những gì bạn thấy là hành vi dự định.

Mỗi sự kiện chạm chỉ được một điều khiển xử lý. Điều thực sự là exclusiveTouch để ngăn không cho các sự kiện chạm khác được phân phối đến các chế độ xem khác.

Để làm những gì bạn đang cố gắng làm, bạn sẽ phải tự mình thực hiện một số thao tác chạm. Chuyển sự kiện tới cả hai chế độ xem của bạn. Bạn có thể làm điều đó bằng cách thực hiện tất cả các phương thức touchesBegan:, touchesMoved: v.v. và chuyển các sự kiện cho cả hai chế độ xem. Bạn có thể đọc thêm về cách tiếp cận đó trong UIResponder documentation. Một cách tiếp cận khác là thực hiện xử lý sự kiện trong một UIGestureRecognizer trên khung nhìn cuộn mà nhấn kiểm tra thanh trượt và cập nhật giá trị của thanh trượt bằng y-delta. Bạn có thể đọc thêm về trình nhận dạng cử chỉ và xử lý sự kiện trong the section about Gesture Recognizers in the Event Handling Guide for iOS.


Side lưu ý:

Đến ứng dụng Cài đặt và chuyển đổi một switch nửa chiều (ví dụ như chế độ chuyển đổi trên máy bay) và sau đó kéo xuống. Không có gì sẽ xảy ra. Phần còn lại của hệ điều hành hoạt động theo cùng một cách. Bạn có chắc chắn rằng đây là sự tương tác mà bạn thực sự muốn làm không? Các ứng dụng hoạt động khác thường thường cảm thấy kỳ lạ và không quen thuộc.

+0

+1 cho "Để làm những gì bạn đang cố gắng làm, bạn sẽ phải tự mình thực hiện một số thao tác chạm." – morgancodes

+0

@morgancodes Yeah, có lẽ hơi mơ hồ. Tôi đã thêm hai lựa chọn cơ bản và liên kết đến tài liệu liên quan để biết cách xử lý cảm ứng của riêng bạn. –

1

Câu hỏi của bạn làm tôi bối rối một chút. Bạn đang nói một thanh trượt dọc - nhưng kéo sang trái và phải?

Nếu bạn muốn di chuyển các scrollview khi kéo UISlider, cách thích hợp để làm như vậy là

[mySlider addTarget:self action:@selector(sliderMoved:) forControlEvents:UIControlEventValueChanged]; 

- (void) sliderMoved:(UISlider*) slider { 
    myScrollView.contentOffset.x = slider.value * (myScrollView.contentSize.width - myScrollView.bounds.size.width); 
} 

Hy vọng điều này là những gì bạn muốn.

+0

Cảm ơn bạn đã trả lời, nhưng đây không phải là những gì tôi yêu cầu. Tôi đang cố gắng tìm ra cách để cho phép sự kiện touchesMoved áp dụng cho UIScrollview, không chỉ UISlider bên trong scrollview. Tôi muốn một kéo dọc để thay đổi giá trị của thanh trượt, và kéo ngang để thay đổi vị trí của UIScrollview, cách nó sẽ nếu không có thanh trượt dọc theo cách. – morgancodes

0

Tôi nghĩ bạn có thể lấy một số tham chiếu từ ví dụ this trong ví dụ này cho thấy cách hủy mọi liên lạc hoặc bất kỳ trình nhận dạng cử chỉ nào và áp dụng chúng cho các chế độ xem khác.

Có thể điều này dẫn bạn đến các giải pháp của vấn đề của bạn và nếu nó sẽ chỉ cho tôi biết về nó

Chúc mừng codding :)

1

Bạn cần phải thiết lập delaysContentTouches như NO và ngăn chặn các đối tượng UISlider để di chuyển , Kiểm tra mã dưới đây.

mySlider.delaysContentTouches = NO; 

- (BOOL)touchesShouldBegin:(NSSet *)touches withEvent:(UIEvent *)event inContentView:(UIView *)view { 
    if ([view isKindOfClass:[UISlider class]]) 
    { 
     UITouch *touchEvent = [[event allTouches] anyObject]; 
     CGPoint locationEvent = [touchEvent locationInView:view]; 
     CGRect thumbRect; 
     UISlider *mySlide = (UISlider*) view; 
     CGRect trackRect = [mySlide trackRectForBounds:mySlide.bounds]; 
     thumbRect = [mySlide thumbRectForBounds:mySlide.bounds trackRect:trackRect value:mySlide.value]; 
     if (CGRectContainsPoint(thumbRect, locationEvent)) 
      return YES; 
    } 
    return NO; 
}