Iphone UICollectionViewCells与UICollectionViewFlowLayout-出现奇怪的布局
我目前正在xcode中测试一个UICollectionView,它只有一个水平行,类似于一种覆盖流。基本上,我有自己的自定义单元格类和单元格的xib文件,然后在每个单元格上添加另一个带有xib的UIView。如果您想知道为什么,那么我可以在单元格中添加不同的UIView。现在我只添加一个 Edit我跟随了WWDC 2012视频创建UICollectionViewCell的linelayout,但有一点不同。而不是中间的细胞变大,所有其他细胞变小。< /强>Iphone UICollectionViewCells与UICollectionViewFlowLayout-出现奇怪的布局,iphone,ios,xcode,uicollectionview,autolayout,Iphone,Ios,Xcode,Uicollectionview,Autolayout,我目前正在xcode中测试一个UICollectionView,它只有一个水平行,类似于一种覆盖流。基本上,我有自己的自定义单元格类和单元格的xib文件,然后在每个单元格上添加另一个带有xib的UIView。如果您想知道为什么,那么我可以在单元格中添加不同的UIView。现在我只添加一个 Edit我跟随了WWDC 2012视频创建UICollectionViewCell的linelayout,但有一点不同。而不是中间的细胞变大,所有其他细胞变小。< /强> -(NSArray *)layout
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;
for (UICollectionViewLayoutAttributes *attributes in array){
if (CGRectIntersectsRect(attributes.frame, rect)) {
CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;
CGFloat normalizedDistance = distance / ACTIVE_DISTANCE;
if (ABS(distance) < ACTIVE_DISTANCE) {
//THIS WOULD MAKE THE MIDDLE BIGGER
//CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
//attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
//attributes.zIndex = round(zoom);
} else {
//THIS MAKES ALL THE OTHERS NOT IN THE RECT SMALLER
CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
attributes.zIndex = round(zoom);
}
}
}
return array;
下面的内容对我的问题来说都是新的。
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;
for (UICollectionViewLayoutAttributes *attributes in array){
if (CGRectIntersectsRect(attributes.frame, rect)) {
CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;
CGFloat normalizedDistance = distance / ACTIVE_DISTANCE;
if (ABS(distance) < ACTIVE_DISTANCE) {
//THIS WOULD MAKE THE MIDDLE BIGGER
//CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
//attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
//attributes.zIndex = round(zoom);
} else {
//THIS MAKES ALL THE OTHERS NOT IN THE RECT SMALLER
CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
attributes.zIndex = round(zoom);
}
}
}
return array;
-(NSArray*)布局属性ForElementsInRect:(CGRect)rect{
NSArray*数组=[super-layouttributesforementsinrect:rect];
CGRect visibleRect;
visibleRect.origin=self.collectionView.contentOffset;
visibleRect.size=self.collectionView.bounds.size;
用于(UICollectionViewLayoutAttribute*数组中的属性){
if(CGRectIntersectsRect(attributes.frame,rect)){
CGFloat distance=CGRectGetMidX(visibleRect)-attributes.center.x;
CGFloat归一化距离=距离/有效距离;
if(ABS(距离)<有效距离){
//这将使中间更大
//CGFloat变焦=1+变焦系数*(1-ABS(标准化距离));
//attributes.transform3D=CATTransformM3DMakeScale(缩放,缩放,1.0);
//attributes.zIndex=圆形(缩放);
}否则{
//这会使不在矩形中的所有其他矩形变小
CGFloat变焦=1+变焦系数*(1-ABS(标准化距离));
attributes.transform3D=CATTransformM3DMakeScale(缩放,缩放,1.0);
attributes.zIndex=圆形(缩放);
}
}
}
返回数组;
}
问题可以在所附的图像中看到
粉红色=集合视图大小
棕色=单元格大小
绿色=单元格内容大小和内容大小的附加xib
我想我的问题在于布局。当sell退出队列时,上面的代码会使它变小。然后,当它被重用时,单元格会再次变大,但内容视图不会
我已经厌倦了手动设置内容视图的框架,但那没有任何作用
更新1:仅当我将xib添加到单元格内容视图时,才会发生这种情况。如果内容视图没有子视图,则没有问题
更新2:单元格的子视图my xib似乎没有调整大小。我曾尝试手动更改其帧大小,但唯一有帮助的地方是cells drawrect方法,这让我感觉像是一个黑客。重复使用的单元格无法重新绘制自身,因此请致电
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *array = [super layoutAttributesForElementsInRect:rect];
CGRect visibleRect;
visibleRect.origin = self.collectionView.contentOffset;
visibleRect.size = self.collectionView.bounds.size;
for (UICollectionViewLayoutAttributes *attributes in array){
if (CGRectIntersectsRect(attributes.frame, rect)) {
CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;
CGFloat normalizedDistance = distance / ACTIVE_DISTANCE;
if (ABS(distance) < ACTIVE_DISTANCE) {
//THIS WOULD MAKE THE MIDDLE BIGGER
//CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
//attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
//attributes.zIndex = round(zoom);
} else {
//THIS MAKES ALL THE OTHERS NOT IN THE RECT SMALLER
CGFloat zoom = 1 + ZOOM_FACTOR *(1- ABS(normalizedDistance));
attributes.transform3D = CATransform3DMakeScale(zoom, zoom, 1.0);
attributes.zIndex = round(zoom);
}
}
}
return array;
-(void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self setNeedsDisplay]; // force drawRect:
}
从UICollectionView的CellForItemAtIndex路径。
也看看
这个我的回答非常具体,我不确定它是否对任何人都有帮助 问题是我在灰色视图的底部有一个约束。在我将这个约束也更改为小于或等于之后,出于某种原因,它起了作用 现在我知道这并不能解释为什么它不会发生在每个细胞上,但它解决了我的问题 因此,如果您在搜索后降落在这里,您的回答可能也值得一看
编辑:6.0 UiCollectionView控制器中似乎也存在一些bug,这些bug在6.1中似乎已修复谢谢。虽然我认为你的答案是好的,在这种情况下可能会有所帮助,但我不知道修复我的自动布局约束实际上已经修复了它。实际上,你的解决方案和我的解决方案都没有帮助。我希望正确的做法是使用此线程来找到解决方案,而不是打开一个新问题。我将编辑以上内容。