带有自定义 UICollectionViewCell 的 UICollectionView

Posted

技术标签:

【中文标题】带有自定义 UICollectionViewCell 的 UICollectionView【英文标题】:UICollectionView with Custom UICollectionViewCell 【发布时间】:2014-01-03 11:16:01 【问题描述】:

我有一个带有自定义单元格的 UICollectionView。在我尝试以编程方式而不是从情节提要创建集合视图之前,我已经完全完成了这项工作。我这样做是因为我无法针对不同的屏幕尺寸更改集合视图的框架尺寸。所以我尝试以编程方式创建一个集合视图。我的问题是我的自定义单元格不起作用。 对于我的自定义单元格,我在视图中画了一个圆圈,用户 cornerradius 在单元格的视图上,有一个 UILabel 和一个 UIImageView。

我画了一个圆圈并在自定义单元格的drawRect: 中执行cornerradius 的事情。其余的,即:将图像放在 ImageView 中,将文本放在 UILabel 中,我在 collectionView 数据源方法中完成。

我遇到的问题是我没有让cornerradius 工作,尽管奇怪的是我可以在视图上画一个圆圈。第二个问题是我没有在图像视图中获得图像,并且标签中没有文本

这是我的代码。我在ViewDidload: 方法中创建集合视图。

 [layout setSectionInset:UIEdgeInsetsMake(24, 10, 24, 10)];

 [layout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
 [layout setMinimumLineSpacing:15];
 [layout setMinimumInteritemSpacing:10];
 self.collectionView = [[UICollectionView alloc]initWithFrame:rect collectionViewLayout:layout];
 self.collectionView.delegate=self;
 self.collectionView.dataSource=self;
 [self.collectionView registerClass:[customCell class] forCellWithReuseIdentifier:@"cell"];
 self.collectionView.backgroundColor= [UIColor blackColor];
 self.searchBar.delegate = self;
 self.locations = [[NSArray alloc]init];
 self.location = [[NSString alloc]init];
 [self.view addSubview:self.collectionView];

这是我的 customCell.m 的 drawRect:

- (void)drawRect:(CGRect)rect

    UIBezierPath *circularpath = [[UIBezierPath alloc]init];
    CGRect Rect = CGRectMake(6, 20, 130, 130);//338
    CGPoint mypoint = CGPointMake(Rect.origin.x + (Rect.size.width / 2), Rect.origin.y + (Rect.size.height / 2));
    NSLog(@"Circle center point::%f, %f", mypoint.x, mypoint.y);

    circularpath = [UIBezierPath bezierPathWithOvalInRect:Rect];
    circularpath.lineWidth = 3.0;
    [[UIColor whiteColor]setStroke];
    UIImage *ori = [UIImage imageNamed:@"drogba.jpg"];
    UIImage *image = [[UIImage alloc]initWithCGImage:ori.CGImage scale:1.45 orientation:UIImageOrientationUp];
    [[UIColor colorWithPatternImage:image]setFill];
    NSLog(@"Circular path:%@", circularpath);
    //this works
    [circularpath stroke];
    //this does not
    self.viewForBaselineLayout.layer.cornerRadius = 8.0f;

这是我的数据源方法

customCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
UIImage *image = [[UIImage alloc]init];
   if([self.allInfo count]>0)
       image = [self getImageForLocation:[self.allInfo objectAtIndex:indexPath.item]];
       NSDictionary *dict = [[NSDictionary alloc]initWithDictionary:[self.allInfo objectAtIndex:indexPath.item]];
       NSDictionary *city = [dict objectForKey:@"city"];
       NSString *name = [[NSString alloc]initWithString:[city objectForKey:@"name"]];
       cell.locationLabel.text = name;
       cell.imageView.image = [self getImageForSky:dict];
       cell.viewForBaselineLayout.backgroundColor = [UIColor colorWithPatternImage:image];
       cell.tempLabel.text = [self getTempForLocation:dict];
   
NSLog(@"image description:%f", image.size.height);
count =1;
return cell;

我认为我的数据没有问题,因为我所做的只是以编程方式创建集合视图,而不是使用情节提要。

编辑:: 我必须为自定义单元格分配初始化图像视图和标签,然后将它们添加为子视图。现在我的 4 个问题中的 3 个已经解决了。我仍然无法让拐角半径为我工作。我想为我的单元格设置一个稍微弯曲的边框

【问题讨论】:

【参考方案1】:

首先,因为我从情节提要中删除了单元格,所以我必须将视图作为子视图添加到单元格的视图中。其次,为了获得圆角,我还必须将masksToBounds 设置为YES 所有这些都必须在自定义单元格的initWithFrame: 方法中完成。这里的代码sn -p

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 

        self.imageView = [[UIImageView alloc]init];
        self.imageView.frame = CGRectMake(26, 27, 90, 90);
        self.tempLabel = [[UILabel alloc]initWithFrame:CGRectMake(26, 125, 90, 21)];
        self.locationLabel = [[UILabel alloc]initWithFrame:CGRectMake(11, 156, 121, 21)];
        self.tempLabel.textAlignment = NSTextAlignmentCenter;
        self.tempLabel.textColor = [UIColor whiteColor];
        self.locationLabel.textAlignment = NSTextAlignmentCenter;
        self.locationLabel.textColor = [UIColor whiteColor];

       [self.viewForBaselineLayout addSubview:self.imageView];
       [self.viewForBaselineLayout addSubview:self.tempLabel];
       [self.viewForBaselineLayout addSubview:self.locationLabel];

       self.viewForBaselineLayout.layer.masksToBounds = YES;
       self.viewForBaselineLayout.layer.cornerRadius = 8.0f;
    
    return self;

【讨论】:

【参考方案2】:

您的自定义单元格中有 init 方法

- (id)initWithFrame:(CGRect)frame

在此方法中更改拐角半径。 附言对我有用。

【讨论】:

以上是关于带有自定义 UICollectionViewCell 的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义控件和自定义 StringProperty 的 Proguard

带有 fmt 的自定义格式说明符用于自定义类

带有自定义按钮的自定义 UIAlertView

带有自定义数据的自定义 UIActivity

ios开发之-- tableview/collectionview获取当前点击的cell

自定义 Combobox 控件自定义数据源,带有自定义 displaymember 和 valuemember