带有自定义 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