我想实现的是一个UIScrollView动态加载照片的程序,使用的是SDImageManager开源代码来实现图片的下载和缓存的使用; 在block做为参数的回调函数中一张一张添加图片UIImageView到 Scrollview上
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
imageview = [[UIImageView alloc] initWithFrame:CGRectMake(scrollview.frame.size.width*i, 10.0,scrollview.frame.size.width, scrollview.frame.size.height-20)];
imageview.image = image;
[scrollview addSubview:imageview];
}
}];
在block代码体里面,可以打印看到UIImageview 都添加到了ScrollView上了。但是在block代码体外访问ScrollView里面的子视图都是空的,并有没添加任何ImageView. 而且scrollview的delegate方法都失效了,目前不知道什么原因,请各位老师指点,指教。下面附上.m的实现代码 谢谢!
@implementation AlbumScroll
-(void)setArrOfImages:(NSMutableArray *)arr
{
mm= 80;
scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 30, 734, 550)];
scrollview.contentSize = CGSizeMake((scrollview.frame.size.width+10)*([arrOfImages count])+10, scrollview.frame.size.height);
//用它指定 ScrollView 中内容的当前位置,即相对于 ScrollView 的左上顶点的偏移
scrollview.contentOffset = CGPointMake(0, 0);
//按页滚动,总是一次一个宽度,或一个高度单位的滚动
scrollview.pagingEnabled = YES;
[scrollview setDelegate:self];
scrollview.scrollEnabled = YES;
scrollview.showsVerticalScrollIndicator = NO;
scrollview.showsHorizontalScrollIndicator = YES;
[self addSubview:scrollview];
arrOfImages = arr;
CLog(@"arrofimages is %@",arrOfImages);
//配置每一张imageView 图片,并添加到scrollview
SDWebImageManager *manager = [SDWebImageManager sharedManager];
for (int i =0; i<arrOfImages.count ; i++) {
NSString *picturePath = [arrOfImages objectAtIndex:i];
NSURL *imageUrl = [NSURL URLWithString:picturePath];
[manager
downloadImageWithURL:imageUrl
options:0
progress:^(NSInteger receivedSize, NSInteger expectedSize) {
}
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
if (image) {
imageview = [[UIImageView alloc] initWithFrame:CGRectMake(scrollview.frame.size.width*i, 10.0,scrollview.frame.size.width, scrollview.frame.size.height-20)];
imageview.image = image;
[scrollview addSubview:imageview];
}
}];
}
pageControl = [[UIPageControl alloc] init];
pageControl.frame = CGRectMake(336,620, 122, 36);
pageControl.numberOfPages = arrOfImages.count;
pageControl.currentPage = 0;
[pageControl addTarget:self
action:@selector(pageTurn:)forControlEvents:UIControlEventValueChanged];
[self addSubview:pageControl];
CLog(@"scrollview.subviews is %@",scrollview.subviews);
}
@end
4楼 @qianshijia 感谢你的提示,刚打断点看了确实是先执行CLog(@"scrollview.subviews is %@",scrollview.subviews); 后才执行complete 中的block回调函数,所以导致scrollview的子视图是空的。
请问有什么方法解决这个问题吗? 我在block回调中一张一张增加scrollview 的图片,然后在block代码体外能使用,能滑动?
5楼 @shifeng310 在图片加载之前,根据图片的数量设置scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * i, scrollView.frame.size.height)
,然后在每一页上放一个placeholder,图片加载完成后替换这个placeholder
我猜,你想要的是
dispatch_async(dispatch_get_main_queue(), ^{
});
========
仔细看了下, 好像不是
嗯, 你可以写个方法,放到block 里面进行调用
因为block 的调用是要等图片下载完成的
completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {
这个是一个回调用的block,意思就是说,当我加载完了,我就调用里面的block,所以你在后面直接加上打印室不可以出来的。
就像是你告诉一个服务员,帮我来一份糖醋里脊,然后他刚去准备菜的时候你立即就问,准备好了吗?你说人家怎么可能准备的好。
解决方案有很多,你可以直接把内容写到 block里面,也可以把block后面的一坨代码,封装到一个方法里,比如setupView
之类的,然后在 block 的结尾调用这个方法进行初始化。
10楼 @callmewhy 非常感谢你的热心回复,代码的问题在你的点拨下弄清楚了,也就是作用域的问题,解决方法也是你提供的方式,在block的代码体里面,调用一个封装好的方法,该方法里设置了下scrollview的属性。代码就能正确运行,一张张读取网络图片了,非常感谢,能不能加个联系方式,偶尔线上交流交流啊