2011-12-04 29 views
8

Tôi đang cố gắng giới hạn vùng vuốt của UIScrollview, nhưng tôi không thể làm điều đó.Vùng quét giới hạn UIScrollview

Tôi muốn đặt khu vực vuốt chỉ lên đầu UIScrollview, nhưng tôi muốn đặt tất cả nội dung hiển thị.

Cập nhật:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count] > 0) { 
     UITouch *tempTouch = [touches anyObject]; 
     CGPoint touchLocation = [tempTouch locationInView:self.categoryScrollView]; 
     if (touchLocation.y > 280.0) 
     { 
      NSLog(@"enabled"); 
      self.categoryScrollView.scrollEnabled = YES; 
     } 
    } 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
// [super touchesEnded:touches withEvent:event]; 
    self.categoryScrollView.scrollEnabled = YES; 
    [self.categoryScrollView touchesBegan:touches withEvent:event]; 
} 

Giải pháp: không quên để thiết lập delaysContentTouches để NO trên UIScrollView

self.categoryScrollView.delaysContentTouches = NO; 
+0

Đẹp nhất! 2 năm sau, bạn đã giúp tôi: P – NSPunk

Trả lời

7

Bạn có thể vô hiệu hóa di chuyển trên UIScrollView, ghi đè touchesBegan:withEvent: trong điều khiển điểm của bạn, kiểm tra xem bất kỳ chạm nào đã bắt đầu trong khu vực mà bạn muốn bật vuốt và nếu câu trả lời là 'có', hãy bật lại cuộn. Đồng thời ghi đè lên touchesEnded:withEvent:touchesCancelled:withEvent: để tắt tính năng cuộn khi chạm xong.

+0

Xin chào, đã xảy ra sự cố. Vuốt chỉ được bật sau khi chạm vào kết thúc, không phải trong giai đoạn cảm động hiện tại: ( –

+0

@ ViskyMáté Tôi không chắc chắn rằng nó có hiệu quả hay không, nhưng tôi nghĩ rằng nó đáng để quay. Một điều khác cần thử là giữ cho cuộn được bật , vô hiệu hóa nó trong 'touchesMoved: withEvent:' nếu chúng nằm ngoài vùng, và kích hoạt lại cuộn trong 'touchesEnded' /' touchesCancelled'. – dasblinkenlight

+0

Nó bắt đầu hoạt động, nhưng: (nó không hoạt động Có một sự chậm trễ ngắn trước khi touchBegin/Cancel/Moved bị sa thải, đó là lý do tại sao nếu tôi pinching nhanh, nó không hoạt động, bất cứ lúc nào nó đang hoạt động Nếu bạn có thể giúp tôi thay đổi độ trễ này (i Không may, đó là giải pháp tuyệt vời và thành công nhất là –

4

This blog post giới thiệu cách thực hiện chức năng rất đơn giản và rõ ràng.

// init or viewDidLoad 

    UIScrollView *scrollView = (UIScrollView *)view; 
    _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init]; 
    _scrollViewPanGestureRecognzier.delegate = self; 
    [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier]; 

// 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer 
{ 
return NO; 
} 

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer 
{ 
    if (gestureRecognizer == _scrollViewPanGestureRecognzier) 
    { 
    CGPoint locationInView = [gestureRecognizer locationInView:self.view]; 
    if (locationInView.y > SOME_VALUE) 
    { 
     return YES; 
    } 
    return NO; 
    } 
    return NO; 
} 
4

Các câu trả lời khác không phù hợp với tôi. Subclassing UIScrollView đã làm việc cho tôi (Swift 3):

class ScrollViewWithLimitedPan : UIScrollView { 
    // MARK: - UIPanGestureRecognizer Delegate Method Override - 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     let locationInView = gestureRecognizer.location(in: self) 
     print("where are we \(locationInView.y)") 
     return locationInView.y > 400 
    } 
} 
+0

Tôi nghĩ đây là cách "sạch" nhất. –

+0

đây là tiện dụng, cổ vũ – jarryd