【问题标题】:UICollectionViewCells with UICollectionViewFlowLayout - strange layout happening带有 UICollectionViewFlowLayout 的 UICollectionViewCells - 发生了奇怪的布局
【发布时间】:2012-12-25 05:59:04
【问题描述】:

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

编辑我已经按照 WWDC 2012 视频创建 UICollectionViewCell 的线条布局,但有一点不同。不是中间的单元格变大,而是所有其他单元格变小。

以下所有内容对我的问题都是新的。

-(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;

}

问题可以在附图中看到。

粉色 = 集合视图大小

棕色 = 单元格大小

绿色 = 单元格内容大小和附加到内容大小的 xib。

我认为我遇到的问题是布局。当卖出出列时,上面的代码使它变小。然后当它被重用时,CELL 会再次变大,但内容视图不会。

我已经厌倦了手动设置内容视图的框架,但这无济于事。

更新 1:这也仅在我将 xib 添加到单元格内容视图时才会发生。如果内容视图没有子视图,则没有问题

UPDate 2:似乎单元格的子视图,我的 xib 没有调整大小。我曾尝试手动更改其帧大小,但唯一有帮助的地方是单元格 drawrect 方法,这对我来说就像是 hack。

【问题讨论】:

    标签: iphone ios xcode uicollectionview autolayout


    【解决方案1】:

    重用单元格无法重绘自身,因此请致电

    -(void)setFrame:(CGRect)frame {
        [super setFrame:frame];
        [self setNeedsDisplay]; // force drawRect:
    }
    

    来自 UICollectionView 的 cellForItemAtIndexPath。 也可以看看this link

    还有这个question

    【讨论】:

    • 谢谢你。虽然我认为您的回答很好,并且在这种情况下可能会有所帮助,但我无缘无故地理解修复我的自动布局约束实际上确实修复了它。
    • 实际上,你的解决方案和我的解决方案都没有帮助。我希望正确的做法是使用这个线程来寻找解决方案,而不是提出一个新问题。我将在上面进行编辑。
    【解决方案2】:

    我的回答非常具体,我不确定它是否会帮助任何人。

    问题是我在灰色视图的底部有一个约束。在我将此约束更改为小于或等于之后,由于某种原因它起作用了。

    现在我知道这并不能解释为什么它没有发生在每个单元格上,但它解决了我的问题。

    因此,如果您在搜索后登陆这里,Harsh 的回答可能也值得一看。

    编辑:6.0 UiCollectionView 控制器中似乎也存在一些错误,这些错误似乎已在 6.1 中修复

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2012-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多