UIscrollView网络加载滚动新闻
这个程序是从网上下载的,我稍作了修改。用到了GCD数据加载,因为本人对block不熟,所以看起来十分纠结。等以后笨猪对block的理解更深入了,再做总结。
基本功能是从网络下载图片,显示在UIScrollView上,每隔6秒滚动一次,我在源程序基础上做了改动,如果图片还没有加载完成,则显示很酷的风火轮,加载完成风火轮消失。
效果图如下:
这次用到了IB,不过很简单,拖两个控件(UIScrollView和UIPageControl)到View上,再在ViewController.h中声明这两个类型的变量,连起来。如图:
#import <UIKit/UIKit.h> @interface ViewController : UIViewController{ IBOutlet UIScrollView *scrollview; IBOutlet UIPageControl *page; NSArray *Arr; int TimeNum; BOOL Tend; } -(void)AdImg:(NSArray*)arr; - (void) setCurrentPage:(NSInteger)secondPage; - (void)createActivityView:(UIImageView*)img; - (void)stopActivityView:(UIImageView*)img; @property(retain,nonatomic)UIScrollView *scrollview; @property(retain,nonatomic)UIPageControl *page; @end
ViewController.m
#import "ViewController.h" @interface ViewController () @end @implementation ViewController @synthesize scrollview,page; - (void)viewDidLoad { [super viewDidLoad]; [NSTimer scheduledTimerWithTimeInterval:1 target: self selector: @selector(handleTimer:) userInfo:nil repeats: YES]; Arr=[[NSArray alloc]initWithObjects: @"http://www.sootuu.com/photo/uploadfile/2006-4/20064223635877.jpg", @"http://www.sootuu.com/photo/uploadfile/2006-4/2006422377122.jpg", @"http://pic7.nipic.com/20100604/668573_235438084702_2.jpg",nil]; [self AdImg:Arr]; [self setCurrentPage:page.currentPage]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } #pragma mark - 6秒换图片 - (void) handleTimer: (NSTimer *) timer { if (TimeNum % 6 == 0 ) { if (!Tend) { page.currentPage++; if (page.currentPage==page.numberOfPages-1) { Tend=YES; } }else{ page.currentPage--; if (page.currentPage==0) { Tend=NO; } } [UIView animateWithDuration:1.0 //速度1.0秒 animations:^{//修改坐标 self.scrollview.contentOffset = CGPointMake(page.currentPage*320,0); }]; } TimeNum ++; NSLog(@"TimeNum==%d",TimeNum); } #pragma mark - 下载图片 void UIImageFromURL( NSURL * URL, void (^imageBlock)(UIImage * image), void (^errorBlock)(void) )//block是一段可以在任何时候执行的代码段 {
//这里把imageBlock当做了一个变量,它封装了一段代码,这段代码在-(void)AdImg:(NSArray*)arr中 dispatch_async( dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0 ), ^(void) { NSData * data = [[NSData alloc] initWithContentsOfURL:URL] ; UIImage * image = [[UIImage alloc] initWithData:data]; dispatch_async( dispatch_get_main_queue(), ^(void){//异步加载图 if( image != nil ) { imageBlock( image ); } else { errorBlock(); } }); }); } -(void)AdImg:(NSArray*)arr{ [self.scrollview setContentSize:CGSizeMake(320*[arr count], 211)]; page.numberOfPages=[arr count]; for ( int i=0; i<[arr count]; i++) { NSString *url=[arr objectAtIndex:i]; UIImageView *img=[[UIImageView alloc]initWithFrame:CGRectMake(320*i, 0, 320, 211)]; img.backgroundColor = [UIColor whiteColor]; // img.tag = 1000 + i; [self createActivityView:img]; [self.scrollview addSubview:img]; UIImageFromURL([NSURL URLWithString:url], ^( UIImage * image ){ [img setImage:image]; [self stopActivityView:img]; }, ^(void){}); [img release];//红色的字体就是上一个函数imageBlock封装起来的代码段,执行的时候直接用这段代码替换void (^imageBlock)(UIImage * image) } } #pragma mark - scrollView && page - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ page.currentPage=scrollView.contentOffset.x/320;//设置当前页的偏移位置 [self setCurrentPage:page.currentPage]; } - (void) setCurrentPage:(NSInteger)secondPage { for (NSUInteger subviewIndex = 0; subviewIndex < [page.subviews count]; subviewIndex++) {//从UIPageControl的subviews中获得每张图片,再替换 UIImageView* subview = [page.subviews objectAtIndex:subviewIndex]; CGSize size; size.height = 24/2; size.width = 24/2; [subview setFrame:CGRectMake(subview.frame.origin.x, subview.frame.origin.y, size.width,size.height)]; if (subviewIndex == secondPage) [subview setImage:[UIImage imageNamed:@"a.png"]]; else [subview setImage:[UIImage imageNamed:@"d.png"]];//这里是把UIPageControl的小图标换了 } } - (void)createActivityView:(UIImageView*)img//创建风火轮 { static int size = 40; UIActivityIndicatorView *activityView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; activityView.frame = CGRectMake(img.frame.size.width/2 - size/2, img.frame.size.height/2 - size/2, size, size); // activityView.tag = img.tag; [img addSubview:activityView]; [activityView startAnimating]; [activityView release]; } - (void)stopActivityView:(UIImageView*)img;//移除风火轮 { // UIActivityIndicatorView *actvityIdcator = [[UIActivityIndicatorView alloc]init]; // actvityIdcator.tag = img.tag; // NSLog(@"第%d个加载完成",actvityIdcator.tag); if (img.image != nil) for (UIView *view in [img subviews]) {//读出UIButton里的所有控件,再选择UIActivityIndicatorView进行更改 if ([view isKindOfClass:[UIActivityIndicatorView class]]) { [view removeFromSuperview];//把风火轮UIActivityIndicatorView移除 } } } - (void)dealloc { [scrollview release]; [page release]; [Arr release]; [super dealloc]; } @end