如何在 iOS 的 iCarousel 中显示图像全屏?
Posted
技术标签:
【中文标题】如何在 iOS 的 iCarousel 中显示图像全屏?【英文标题】:How to show Image Full Screen that showing in iCarousel in iOS? 【发布时间】:2014-03-08 18:18:49 【问题描述】:我正在使用iCarousel
自定义控件来显示来自使用 JSON 数据的 Web 图像。
这是我在iCarousel
中显示图像的代码
在 ViewDidLoad 中加载 JSON 数据
JSONLoader *jsonLoader = [[JSONLoader alloc]init];
self.items = [[NSMutableArray alloc]init];
[self.items removeAllObjects];
self.items = (NSMutableArray *) [jsonLoader loadJSONDataFromURL:[NSURL URLWithString:@"https://public-api.wordpress.com/rest/v1/sites/www.myWebsite.com/posts?category=blog&page=1"]];
- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index reusingView:(AsyncImageView *)view
MMSPLoader *mmObject = [self.items objectAtIndex:index];
view = [[AsyncImageView alloc]initWithFrame:CGRectMake(0, 0, 250.0f, 250.0f)];
view.layer.borderColor = [UIColor whiteColor].CGColor;
view.layer.borderWidth = 0.3f;
view.image=[UIImage imageNamed:@"page.png"];
view.imageURL = [NSURL URLWithString:[mmObject featureImageUrl]];
return view;
可以正确显示图像。我的情况是,当我点击该图像时,我想全屏显示该图像。所以我使用了GGFullScreenImageViewController
。
但是,当我点击该图像以显示全屏时,我检索了图像 URL 并显示在 GGFullScreenImageViewController
。没关系,但是我不想从那个 URL 检索,因为它再次从网络下载图像并且显示速度变慢。
在我的想法中,我在 iCarousel 中点击图像时保存了该图像并将其显示在 GGFullScreenImageViewController
中。
所以我不需要再次下载图像。
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index
dispatch_queue_t myqueue = dispatch_queue_create("com.i.longrunningfunctionMain", NULL);
dispatch_async(myqueue, ^
UIApplication *apps = [UIApplication sharedApplication];
apps.networkActivityIndicatorVisible = YES;
MMLoader *mmObject = [self.items objectAtIndex:index];
NSData *data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:mmObject.featureImageUrl]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data]];
GGFullscreenImageViewController *vc = [[GGFullscreenImageViewController alloc] init];
vc.liftedImageView = imageView;
dispatch_async(dispatch_get_main_queue(), ^
apps.networkActivityIndicatorVisible = NO;
[self presentViewController:vc animated:YES completion:nil];
);
);
NSLog(@"%i",index);
那么我应该保存到本地文件还是有其他好主意?
【问题讨论】:
【参考方案1】:您确实应该在最初下载图像时使用库来保存图像。 AsyncImageView
不一定是最佳选择,因为它只是缓存在内存中。
也就是说,目前您只能从视图中获取图像。这并不理想,您应该将其保存到磁盘 - 越早越好。看看,也许,SDWebImage
。
从视图中获取图像(在浏览器中输入,以便验证语法和 API 使用...):
- (void)carousel:(iCarousel *)carousel didSelectItemAtIndex:(NSInteger)index
AsyncImageView *view = (AsyncImageView *)[carousel itemViewAtIndex:index];
UIImageView *imageView = [[UIImageView alloc] initWithImage:view.image];
GGFullscreenImageViewController *vc = [[GGFullscreenImageViewController alloc] init];
vc.liftedImageView = imageView;
[self presentViewController:vc animated:YES completion:nil];
【讨论】:
显示警告的第一行代码。 "'carousel' 的本地声明隐藏了实例变量" 所以你不应该将实例变量和参数命名为相同的东西......更改参数的名称。或者,最好将@property 与自动合成一起使用,然后实例变量将命名为_carousel
...
AsyncImageView 会在下载后缓存图像,因此从同一 URL 再次加载图像应该不会有任何性能问题。如果再次下载,要么是 AsyncImageView 的 bug,要么需要增加缓存大小。 Wain 建议的解决方案的问题是,如果您在图像完成加载之前点击它,您将获得一个空白的全屏图像。
FWIW,我同意关于磁盘缓存的观点 - 我认为在这种情况下 SDWebImage 将是一个不错的选择。以上是关于如何在 iOS 的 iCarousel 中显示图像全屏?的主要内容,如果未能解决你的问题,请参考以下文章