如何在 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 中显示图像全屏?的主要内容,如果未能解决你的问题,请参考以下文章

在 iCarousel 图像下放置标签 ios

如何在 xamarin ios 中使用轮播视图

在 iCarousel 控件中在图像上显示文本

如何删除 iCarousel 中的重复项

iCarousel 不显示我的图像目标 C

在 iCarousel 的 iCarouselTypeRotary 视图中隐藏图像