2010-04-03 48 views
7

Tôi có UIScrollView chứa hình ảnh lớn và đang sử dụng phân trang để cuộn giữa các hình ảnh. Để tiết kiệm bộ nhớ, tôi chỉ tải một hình ảnh trước và sau hình ảnh hiện tại và tải/phát hành hình ảnh mới sau khi cuộn xong.Các trang tải lười biếng trong UIScrollView

Sự cố xảy ra khi người dùng cuộn nhanh và scrollViewDidEndDecelerating không được gọi.

Làm cách nào để phát hiện cuộn liên tục?

tôi có thể kiểm tra vị trí mục trên mỗi scrollViewDidScroll nhưng điều này có vẻ hơi nặng nề ...

+0

Là giải pháp thực hiện giảm tốc mã liên quan từ scrollViewDidEndDragging: willDecelerate đang làm việc cho bạn? – spd

Trả lời

0

giải pháp tạm thời của tôi là để hủy di chuyển liên tục bằng cách tắt cuộn từ khi người dùng nhấc ngón tay cho đến khi cuộn đã hoàn thành.

-(void) scrollViewWillBeginDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:NO]; 
} 

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{ 
    [scrollView setScrollEnabled:YES]; 
} 
0

Bạn có thể làm một cái gì đó như thế này

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    CGFloat pageWidth = scrollView.frame.size.width; 
    int page = floor((scrollView.contentOffset.x - pageWidth/1.5)/pageWidth) + 1; 
} 

phương pháp này được gọi là bất cứ lúc nào contentoffset thay đổi cho dù lập trình hay không.

Từ phương pháp này, bạn có thể kiểm tra xem 'trang' có giống trang hiện tại của bạn hay không, nếu không, bạn biết bạn cần tải thứ gì đó. Bí quyết ở đây là làm cho tải hình ảnh mà không cần giữ cuộn cuộn của chế độ xem. Đó là nơi tôi bị mắc kẹt.

tính trang sẽ thay đổi kế/trước khi bạn đang ở nửa đường đến trang tiếp theo

0

nếu bạn vẫn đang tìm kiếm một giải pháp ... Đây là những gì tôi làm, nó hoạt động thực sự tốt có một hiệu suất tốt , quá.

- (void)scrollViewDidEndDragging:(UIScrollView *)sv willDecelerate:(BOOL)decelerate 
{ 
    if (!decelerate) 
    { 
     // load images and unload the ones that are not needed anymore 
     [self someMethod] 
    } 
} 


- (void)scrollViewDidEndDecelerating:(UIScrollView *)sv 
{ 
    // load images and unload the ones that are not needed anymore 
    [self someMethod] 
} 
+0

Thậm chí tôi có cùng một vấn đề như Jean đang gặp phải.Tôi đã thử phương thức scrollViewDidEndDragging: willDecelerate: Nhưng, bất cứ khi nào scrollViewDidEndDecelerating KHÔNG được gọi, scrollViewDidEndDragging: willDecelerate: cũng sẽ không được gọi. Làm thế nào để giải quyết vấn đề này? – spd

2

Có lẽ một cái nhìn bảng với nội dung di động tùy chỉnh sẽ làm việc tốt hơn cho bạn, vì nó có rất nhiều của logic được xây dựng trong chỉ tải các tế bào có thể nhìn thấy như trái ngược với tất cả mọi thứ cùng một lúc. Có rất nhiều hướng dẫn về cách quản lý chế độ xem bảng theo nhiều cách khác nhau.

0

Bạn phải kiểm tra cả scrollViewDidEndDecelerating và scrollViewDidScroll. Khi nào người dùng vuốt và thả nó để cho phép cuộn "động lượng" đầu tiên sẽ được gọi tại và. Nếu người dùng quyết định dừng di chuyển bằng ngón tay của mình bằng cách nhấn vào bảng xem trước (hoặc cuộn xuống dưới cùng, nhưng tôi không chắc chắn về điều đó), sự kiện thứ hai sẽ được kích hoạt.

0

Theo kinh nghiệm của tôi, @ jd291 là chính xác; Tôi đang sử dụng callbacks sau thành công cho hầu hết các nơi

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 
-(void)scrollViewDidScroll:(UIScrollView *)scrollView 
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 

nhưng, trường hợp duy nhất khi một callback không được gọi là bạn có thể không đã thiết lập delegate đúng cách.

0

WWDC 2010 đã nói về điều này. Họ thực hiện tái sử dụng các cuộn cuộn phụ, phân bổ chế độ xem hình ảnh bị thiếu trong scrollViewDidScroll:. Đoạn video có thể giúp:

Session 104 - Designing Apps with Scroll Views

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