具有动态高度的 UICollectionViewCell 使用 NSURL 进行图像下载

Posted

技术标签:

【中文标题】具有动态高度的 UICollectionViewCell 使用 NSURL 进行图像下载【英文标题】:UICollectionViewCell with Dynamic height having the use of NSURL for Image downloading 【发布时间】:2014-02-12 09:38:43 【问题描述】:

嗨,目前,我正忙于我的一个有这个概念的项目 像 Pinterest 这样的动态 UI

我需要像上图这样的 UI。为此,我使用了UICollectionView 并尝试给出动态高度 对于每一个细胞。我无法获得任何成功来实现像这样的 UI 这。我还使用了一些自定义的UICollectionView,即 “PSCollectionView”、“PSTCollectionView”等。

在所有示例中,我发现关于图像及其 高度。他们都从本地来源获取图像并存储 本地存储中图像的高度或直接从 我需要使用 NSURL 从 Web 服务器获取图像的图像 然后我可以给每个单元格的高度..但是我怎么能 做这个?关于这个的任何想法......如果你有任何想法请告诉我 适当的解决方案。

参考图片如下。

【问题讨论】:

您从哪里获得网络服务?我的意思是这是来自公共来源吗? @Nilesh 你有动态单元格大小吗?我也想和你一样。但我也将标签与该图像相加。 【参考方案1】:

对于我现有的具有动态图像的项目,我想采用这种方法,并且您将获得最快的响应。

-(void)fillSizeArray

    for (int i=0; i<[self.arrGCCategory count]; i++)
    
        NSNumber *width = [NSNumber numberWithFloat:200];
        NSNumber *height = [NSNumber numberWithFloat:200];

        NSString *urlString = [[self.arrGCCategory objectAtIndex:i] valueForKey:@"Photo"];
        NSURL *imageFileURL = [NSURL URLWithString:urlString];
        CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageFileURL, NULL);
        if (imageSource) 
            NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache, nil];
            CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (__bridge CFDictionaryRef)options);
            if (imageProperties) 
                width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
                height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
                NSLog(@"Image dimensions: %@ x %@ px", width, height);
                CFRelease(imageProperties);
            
        
        CGSize size = CGSizeMake([width floatValue], [height floatValue]);
        [self.cellHeights addObject:[NSValue valueWithCGSize:size]];
    


#pragma mark - CHTCollectionViewDelegateWaterfallLayout

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

    CGSize size = [[self.cellHeights objectAtIndex:indexPath.row] CGSizeValue];
    return size;

【讨论】:

【参考方案2】:

我个人将它用于类似 pinterest 的布局:

https://github.com/chiahsien/CHTCollectionViewWaterfallLayout

【讨论】:

感谢您的建议,但我已经在我的项目中使用了它。目前,我正在处理来自网络服务器的可变高度图像。【参考方案3】:

使用 UICollectionViewDelegateFlowLayout 方法

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

【讨论】:

【参考方案4】:

可能已经晚了,但是谁曾试图在 collectionviewcontroller 中为其自定义单元格获取动态单元格高度,或者如果有人面临闪烁的问题,请确保您使用的是 UICollectionViewDelegateFlowLayout 中的 sizeForItemAtIndexPath 方法

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

【讨论】:

以上是关于具有动态高度的 UICollectionViewCell 使用 NSURL 进行图像下载的主要内容,如果未能解决你的问题,请参考以下文章

具有动态高度的 UITextView

如何在 iOS 中创建具有动态 tableview 高度的动态 tableview 单元格

UICollectionViewCell 具有 2 列网格和动态高度

UITableViewCell 具有嵌入式垂直堆栈视图设置,具有自动布局和动态高度

具有动态高度的 UITableViewCell 内的 UITableView

UITableView 中具有动态高度的可伸缩标题视图