2010-10-19 30 views
7

Tôi có UIScrollView đang cuộn UIView khá lớn.Hạn chế vùng có thể cuộn trong UIScrollView

Vào những thời điểm nhất định, tôi muốn giới hạn khu vực mà người dùng có thể cuộn xung quanh. Ví dụ: tôi chỉ có thể muốn cho phép họ xem phần dưới cùng của chế độ xem.

Tôi có thể giới hạn khu vực bằng cách ghi đè scrollViewDidScroll và sau đó gọi setContentOffset nếu chế độ xem đã cuộn quá xa. Nhưng bằng cách này tôi không thể làm cho nó bị trả lại một cách mượt mà như UIScrollView có thể tự nhiên làm khi di chuyển vượt ra ngoài giới hạn của UIView.

Có cách nào tốt hơn để giới hạn vùng có thể cuộn trong UIScrollView không?

Trả lời

17

Tôi sẽ thay đổi thuộc tính contentSize của chế độ xem cuộn thành kích thước của khu vực bạn muốn người dùng có thể cuộn xung quanh và điều chỉnh khung.hoạt của khung nhìn con như ranh giới phía trên bên trái bạn muốn xuất hiện tại (0, 0) liên quan đến chế độ xem cuộn. Ví dụ: nếu chế độ xem của bạn cao 800 điểm và bạn muốn hiển thị phần dưới cùng, hãy đặt chiều cao của contentSize thành 200 và đặt thành phần y của view.frame.origin thành -600.

+3

câu trả lời của bạn là chỉ là đỉnh ngay Tôi cần thiết để giải quyết một vấn đề tương tự tôi đã có. Về cơ bản, sự khác biệt giữa uiscrollview.frame.size và uiscrollview.contentsize trở thành phần cuộn được cho phép của bạn. Bạn có thể chơi với uiview được đặt trong uiscrollview bất kỳ cách nào bạn muốn để có được hiệu quả mong muốn bạn muốn bằng cách sử dụng uiview.frame và uiview.size. Một khi bạn hiểu điều này, cuộc sống là tốt. Chúc mừng cuộn! :) – HM1

+0

Đây là ví dụ về giải pháp đóng gói logic tương tự: https://github.com/ealeksandrov/EARestrictedScrollView –

2

Tôi đã tìm được thứ phù hợp với mình. Nó cho phép bạn di chuyển tới điểm 0,0 nhưng không có thêm:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    if (scrollView.contentOffset.x <= -1) { 
     [scrollView setScrollEnabled:NO]; 
     [self.scrollView setContentOffset:CGPointMake(0, 0) animated:YES]; 
     [scrollView setScrollEnabled:YES]; 
    } 
} 

Bạn có thể làm tương tự cho đầu, phía dưới hoặc bên phải (x hoặc y)

+2

Vấn đề với phương pháp này là bạn mất 'thư bị trả' - nơi bạn cuộn ra ngoài vùng và cuộn nhẹ nhàng snaps trở lại khi bạn cho đi. –

+0

Crap bạn nói đúng, không đọc đúng cách. Tuy nhiên, có lẽ điều này có thể giúp người khác. – Yoko

0

Một cách khác là để ghi đè phương pháp 's UIScrollView :

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event.

Trả lại YES sẽ cho phép người dùng cuộn. Trả lại NO sẽ không.

LƯU Ý: này sẽ vô hiệu hóa tất cả chạm đến bất kỳ điểm nhúng bên trong UIScrollView rằng pointInside lợi nhuận NO tới. Hữu ích nếu vùng bạn không muốn cuộn không có bất kỳ tương tác nào.


Ví dụ này chỉ cho phép UIScrollView cuộn khi người dùng cuộn qua UITableView. (A UITableView và hai UIViews được nhúng bên trong UIScrollView)

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { 
    for (UIView *subview in self.subviews) { 
     if ([subview pointInside:[self convertPoint:point toView:subview] withEvent:event] && ![subview isKindOfClass:[UITableView class]]) { 
      return NO; 
     } 
    } 
    return YES; 
} 
Các vấn đề liên quan