我已经将UICollectionViewLayoutAttributes类子类化,并添加了一些自定义属性。
在我的自定义UICollectionViewLayout类中,我重写了静态
+ (Class)layoutAttributesClass
然后我返回我的新属性类。
在我的UICollectionViewLayout类中,我覆盖了-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
,并将值设置为自定义属性。
我可以在那里检查属性类,看看是否正确设置了自定义属性。
所以,最后我需要在UICollectionViewCell中检索这些属性,所以我重写-(void) applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
来获取自定义UICollectionViewLayoutAttributes类中的值,YET它们是nil。好像我从来没有设置它们。
所有其他属性都完美运行,包括转换等。很清楚,我做错了什么。请指教。
包含我自定义类的HeaderFile
@interface UICollectionViewLayoutAttributesWithColor : UICollectionViewLayoutAttributes
@property (strong,nonatomic) UIColor *color;
@end
这是实施。如你所见,没什么特别的
@implementation UICollectionViewLayoutAttributesWithColor
@synthesize color=_color;
@end
答案 0 :(得分:26)
你会很高兴知道答案很简单。您只需要覆盖copyWithZone:因为UICollectionViewAttributes实现了NSCopying协议。正在发生的事情是Apple代码正在制作自定义属性对象的副本,但由于您尚未实现copyWithZone,因此您的自定义属性不会被复制到新对象。以下是您需要做的一个示例:
@interface IRTableCollectionViewLayoutAttributes : UICollectionViewLayoutAttributes {
CGRect _textFieldFrame;
}
@property (nonatomic, assign) CGRect textFieldFrame;
@end
和实施:
- (id)copyWithZone:(NSZone *)zone
{
IRTableCollectionViewLayoutAttributes *newAttributes = [super copyWithZone:zone];
newAttributes->_textFieldFrame = _textFieldFrame;
return newAttributes;
}
答案 1 :(得分:1)
删除自定义值的问题是因为我们必须实现-copyWithZone:因为UICollectionViewLayoutAttributes实现并使用NSCopying
答案 2 :(得分:0)
听起来您正在尝试将布局属性应用于单元格。可以这样做:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
//Get Cell
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];
//Apply Attributes
UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
[cell applyLayoutAttributes:attributes];
return cell;
}
但是,在我的UICollectionView实现中,我只是将自定义属性添加到UICollectionViewCell的子类而不是UICollectionViewLayoutAttributes的子类。我认为在大多数情况下,子类化UICollectionViewCell更有效:
@interface ColoredCollectionCell : UICollectionViewCell
@property (strong,nonatomic) UIColor *color;
@end
@implementation ColoredCollectionCell
// No need to @synthesize in iOS6 sdk
@end
在您的集合视图控制器中:
- (UICollectionViewCell*)collectionView:(UICollectionView*)cv cellForItemAtIndexPath:(NSIndexPath*)indexPath
{
//Get the Cell
ColoredCollectionCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"MY_CELL" forIndexPath:indexPath];
//Get the color from Array of colors
UIColor *thisColor = self.colorsArray[indexPath.item];
//Set cell color
cell.color = thisColor;
return cell;
}