所以,須要找到個方法去延遲加載(lazily load), 9160_ScrollerDemo.zip,在測試時發現圖片都加載到了內存中,致使內存會愈來愈大,所以會考慮到每次只加載三張,即當前這一張,前一張和後一張!而後釋放掉其餘的內存。具體的代碼以下:
第一步:將要加載的內容先置爲空
php
// view controllers are created lazily 將要加載的內容先置爲空
app
// in the meantime, load the array with placeholders which will be replaced on demand
ide
NSMutableArray *controllers = [[NSMutableArray alloc] init];
測試
for (unsigned i = 0; i < kNumberOfPages; i++)
ui
{
spa
[controllers addObject:[NSNull null]];
code
}
圖片
self.viewControllers = controllers;
ip
[controllers release];內存
- (void)loadScrollViewWithPage:(int)page
{
// 判斷內容頁面是否到了第一或者最後一頁
if (page < 0)
return;
if (page >= kNumberOfPages)
return;
// replace the if necessary 加載scrollView裏的該page內容頁面,自定義的MyViewController
MyViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
controller = [[MyViewController alloc] initWithPageNumber:page];//自定義的viewController初始方法
[viewControllers replaceObjectAtIndex:page withObject:controller];//替換以前內容置爲空的相應頁面
[controller release];
}
// add the controller's view to the scroll view 將已替換的頁面再加入到scrollView中顯示
if (controller.view.superview == nil)
{
CGRect frame = scrollView.frame;//設定該page的frame
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
NSDictionary *numberItem = [self.contentList objectAtIndex:page];//加載一些自定義的內容
controller.numberImage.p_w_picpath = [UIImage p_w_picpathNamed:[numberItem valueForKey:ImageKey]];
controller.numberTitle.text = [numberItem valueForKey:NameKey];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)sender
{
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
// 控制在頁面轉到50%的時候設定加載新內容
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];
// 這裏就能夠本身設定去釋放那些沒有加載的內容了
[viewControllers replaceObjectAtIndex:page-2 withObject:[NSNull null]];
[viewControllers replaceObjectAtIndex:page-3 withObject:[NSNull null]];
[viewControllers replaceObjectAtIndex:page+2 withObject:[NSNull null]];
[viewControllers replaceObjectAtIndex:page+3 withObject:[NSNull null]];
}
}
}
MyScrollView *page1 = [viewControllers objectAtIndex:page-2];
if ((NSNull *)page1 != [NSNull null])
{
page1.p_w_picpathView.p_w_picpath = nil;
}
for (int i=0; i<currentPage-1; i++) {
MyScrollView *page_1 = [viewControllers objectAtIndex:i];
if ((NSNull *)page_1 != [NSNull null])
{
page_1.p_w_picpathView.p_w_picpath = nil;
}
[viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
}
for (int i=currentPage+1; i<num;i++) {
MyScrollView *page_2 = [viewControllers objectAtIndex:i];
if ((NSNull *)page_2 != [NSNull null])
{
page_2.p_w_picpathView.p_w_picpath = nil;
}
[viewControllers replaceObjectAtIndex:i withObject:[NSNull null]];
}