【问题标题】:How to customise UICollectionView Cell to show image grid as shown in attachment?如何自定义 UICollectionView Cell 以显示图像网格,如附件所示?
【发布时间】:2021-02-08 17:10:40
【问题描述】:

我想显示附件中显示的图像。如何使用情节提要和目标 c 做到这一点?

根据图像计数,需要调整单元格大小。

【问题讨论】:

  • 嗨 - 漂亮的照片。我认为您需要为此查看组合布局。
  • 但它仅适用于 iOS13+ :(
  • 您的最低 iOS 版本是多少?如果低于 13,您可以使用水平集合视图并使用集合视图单元格的大小来获得类似的结果。
  • iOS 9. 好的会试试
  • 好的 - 这里有一点轮廓......我认为您需要水平滚动,并且第一张图片的边数是其他图片的两倍。这会给你一个大的第一张图像,然后是它旁边的瓷砖。即使在 iOS 9 中,这实际上也很容易,但可能不是您想要的。

标签: ios objective-c uicollectionview storyboard uicollectionviewcell


【解决方案1】:

编辑

此答案适用于具有基于第一张大图像和后一张较小图像的单一布局的原始问题。

这真的很简单......我没有打扰iOS版本,我在下面给出的需要很多额外的工作,但至少它会给你这个想法。

故事板

在故事板中,我实际上只是在集合视图中设置了两个项目。一张大图和一张小图。你可以很容易地用一个来做,这里我用两个,然后我可以将图像加载到情节提要中,而不必费心配置单元格。

希望下面的图片能帮助您理解我的意思。还要注意水平滚动。

集合视图

这是赤裸裸的。当然,它需要工作。特别是我没有进行单元格配置,而是在没有任何配置的情况下直接出列并返回单元格。您需要通过加载应为其显示的图像来配置每个单元格。

我在故事板中定义的两种单元格类型称为imgLargeimgSmall。请注意,我也使用相同的项目标识符。

这里最重要的,真正使它起作用的,是最后一条消息,我为两个不同的单元格返回两个不同的大小。

#import "TestCollectionViewController.h"

@interface TestCollectionViewController () < UICollectionViewDataSource, UICollectionViewDelegateFlowLayout >

@end

@implementation TestCollectionViewController

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    self.collectionView.collectionViewLayout.invalidateLayout;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view.
    self.collectionView.dataSource = self;
    self.collectionView.delegate   = self;
}

#pragma mark <UICollectionViewDataSource>

- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
}

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return 10;
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {

    if ( indexPath.row )
    {
        return [collectionView dequeueReusableCellWithReuseIdentifier:@"imgSmall" forIndexPath:indexPath];
    }
    else
    {
        return [collectionView dequeueReusableCellWithReuseIdentifier:@"imgLarge" forIndexPath:indexPath];
    }
}

#pragma mark <UICollectionViewDelegate>

- ( CGSize ) collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CGFloat h = collectionView.bounds.size.height;

    if ( indexPath.row )
    {
        return CGSizeMake( h / 2, h / 2 );
    }
    else
    {
        return CGSizeMake ( h, h );
    }
}

@end

这实际上是第二个版本。第一个版本在这里只使用了常量。由于它们是计算出来的,要使其正常工作,您需要在情节提要中将所有间距和插图设置为 0。

结果

瞧!

我提到这是第二个版本。前一个看起来略有不同,如下所示。图片我保留了,之前的代码看一下这个帖子的历史。

【讨论】:

  • 您好,非常感谢您的解释和示例。我已经根据我的全部要求编辑了这个问题。您在这里提到的具有大小调整的单个集合视图是否足够?请提出您的建议。
  • 是的,一个就可以了——你可以在计算大小的方法中添加一些逻辑......我之前在这里给出了一个示例,但它是错误的,但想法会起作用,只需计算大小基于图像的数量。
  • 您可能还想创建一个具有宽度的变量w,然后您只需使用宽度和高度(w 和h)来返回适当的大小。剩下的只是简单的数学......如果有这样的事情......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-08
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多