Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone UICollectionViewCells与UICollectionViewFlowLayout-出现奇怪的布局_Iphone_Ios_Xcode_Uicollectionview_Autolayout - Fatal编程技术网

Iphone UICollectionViewCells与UICollectionViewFlowLayout-出现奇怪的布局

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

我目前正在xcode中测试一个UICollectionView,它只有一个水平行,类似于一种覆盖流。基本上,我有自己的自定义单元格类和单元格的xib文件,然后在每个单元格上添加另一个带有xib的UIView。如果您想知道为什么,那么我可以在单元格中添加不同的UIView。现在我只添加一个

Edit我跟随了WWDC 2012视频创建UICollectionViewCell的linelayout,但有一点不同。而不是中间的细胞变大,所有其他细胞变小。< /强>

-(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中似乎已修复

谢谢。虽然我认为你的答案是好的,在这种情况下可能会有所帮助,但我不知道修复我的自动布局约束实际上已经修复了它。实际上,你的解决方案和我的解决方案都没有帮助。我希望正确的做法是使用此线程来找到解决方案,而不是打开一个新问题。我将编辑以上内容。