我有五行细胞,每行包含四个细胞--5x4。我试图完成几乎像Apple一样的效果。屏幕中心的行应该具有100x100的单元格大小,其余的返回大小为80x80。滚动时,远离中心的行应转为80x80,移动到中心的行应转为100x100。
我已实施prepareLayout
,layoutAttributesForElementsInRect
和layoutAttributesForItemAtIndexPath
所以现在我有一个100x100细胞中心行,其余80x80。
为了让它变得动态,我实现shouldInvalidateLayoutForBoundsChange
但没有任何反应。
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{
NSMutableArray *allAttributes = [NSMutableArray arrayWithCapacity:self.layoutInfo.count];
[self.layoutInfo enumerateKeysAndObjectsUsingBlock:^(NSString *elementIdentifier,
NSDictionary *elementsInfo,
BOOL *stop) {
[elementsInfo enumerateKeysAndObjectsUsingBlock:^(NSIndexPath *indexPath,
UICollectionViewLayoutAttributes *attributes,
BOOL *innerStop) {
// NSLog(@"%f, %f", newBounds.origin.x, newBounds.origin.y);
if ((newBounds.origin.y < [[UIScreen mainScreen]bounds].size.height/2-50) && (newBounds.origin.y > [[UIScreen mainScreen]bounds].size.height/2+50)) {
CGRect frame = attributes.frame;
frame.size.width = 100.0f;
frame.size.height = 100.0f;
attributes.frame = frame;
}else{
CGRect frame = attributes.frame;
frame.size.width = 80.0f;
frame.size.height = 80.0f;
attributes.frame = frame;
}
[allAttributes addObject:attributes];
}];
}];
return YES;
}
答案 0 :(得分:0)
shouldInvalidateLayoutForBoundsChange:
经常被调用(每当视图调整大小或滚动时......),所以你可能不需要在那里完成所有工作。如果你知道你的单元格总是有固定的大小和位置,那么你可以在这里返回NO
。
只要您已实施prepareLayout
,layoutAttributesForElementsInRect
和layoutAttributesForItemAtIndexPath
,请确保同时实施collectionViewContentSize
以返回内容的总大小。