Tôi có một ứng dụng dựa trên mẫu PageControl của Apple. Lần đầu tiên khung nhìn tải, khung nhìn cuộn được nạp với trang 0 và trang 1. Bất cứ khi nào một cuộn được bắt đầu, phương thức scrollViewDidScroll sẽ được UIKit gọi đúng?Cuộc gọi ứng dụng của tôi scrollViewDidScroll 19 lần
Khi bắt đầu cuộn từ trang 0 đến trang 1, ứng dụng sẽ tải trang-1, trang và trang + 1, (để tránh nhấp nháy trong khi cuộn).
Ứng dụng của tôi có vẻ gọi scrollViewDidScroll
19 lần và phương pháp loadScrollViewWithPage:
của chúng tôi 19 lần với trang 0 và trang 1, trước khi trang đó đến trang 1 và 2, sau đó nó đổ vỡ.
Đây là những phương pháp:
- (void)scrollViewDidScroll:(UIScrollView *)sender {
NSLog(@"scrollviewdidscroll");
// We don't want a "feedback loop" between the UIPageControl and the scroll delegate in
// which a scroll event generated from the user hitting the page control triggers updates from
// the delegate method. We use a boolean to disable the delegate logic when the page control is used.
if (pageControlUsed) {
// do nothing - the scroll was initiated from the page control, not the user dragging
return;
}
// Switch the indicator when more than 50% of the previous/next page is visible
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth/2)/pageWidth) + 1;
pageControl.currentPage = page;
// load the visible page and the page on either side of it (to avoid flashes when the user starts scrolling)
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
// A possible optimization would be to unload the views+controllers which are no longer visible
}
- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= kNumberOfPages) return;
NSLog(@"page: %i", page);
// replace the placeholder if necessary
KeyboardViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
controller = [[KeyboardViewController alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
}
// add the controller's view to the scroll view
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
frame.size.height = scrollView.frame.size.height;
controller.view.frame = frame;
[scrollView setAutoresizesSubviews:YES];
[scrollView setAutoresizingMask:UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight];
[scrollView addSubview:controller.view];
}
Tại sao scrollViewDidScroll được gọi rất nhiều lần?
Cảm ơn