ios - 自定义 UICollectionViewFlowLayout 问题

标签 ios uitableview uicollectionview autolayout uicollectionviewcell

我有一个带有子类 UICollectionViewFlow 布局的 Collection View 。
我想要的效果是旋转(透视,圆形 y 轴)和运动缩放。
我的 Collection View 设置为分页模式,水平滚动,每个单元格都有全屏,即它们的框架等于 Collection View 的边界。每个单元格内部都有一个表格 View 。

问题是我的行为很奇怪。当前在屏幕上的单元格内的表格很好。当我平移到另一个单元格时,问题就出现了。单元格内的表格似乎完全错误!它只填满了单元格的一半,即使单元格要大得多。在界面构建器中,我将表格设置为将其边缘粘贴到其 super View (单元格)边缘(自动布局)。

一段时间后,我发现 [cell layoutsubviews] 仅在 View 实例化后被调用一次。由于我在下面的代码中直接设置 UICollectionViewLayoutAttributes 与旋转, TableView 是否可以在考虑初始旋转的情况下进行布局( super View 的框架由于严重的透视旋转而缩小)并且因为 [cell layoutsubiews] 永远不会再次调用它只是保持这种方式?

第二个奇怪的地方是布局的回调没有意义。
Collection View :didEndDisplayingCell:forItemAtIndexPath:
例如,告诉我索引路径处的 View 已停止显示,甚至在它出现在屏幕上之前!

有人可以尝试这种布局,也许可以告诉我我做错了什么?

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return YES;
}
-(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(visibleRect, attributes.frame) &&
            ABS(CGRectGetMidX(visibleRect) - attributes.center.x) <= self.collectionView.frame.size.width)
        {
            CGFloat distance = CGRectGetMidX(visibleRect) - attributes.center.x;
            CGFloat absoluteDistance = ABS(distance);

            CGFloat angle = [self normalizeFromMin:0
                                           fromMax:self.collectionView.frame.size.width
                                             toMin:0
                                             toMax:90
                                             value:absoluteDistance];

            CGFloat scale = [self normalizeFromMin:0
                                           fromMax:self.collectionView.frame.size.width
                                             toMin:0.7
                                             toMax:1
                                             value:absoluteDistance];

            CATransform3D transform = CATransform3DIdentity;
            transform.m34 = 1.0 / -1800;
            if(distance > 0)
            {
                transform = CATransform3DRotate(transform, radians(angle), 0.0, 1.0, 0.0);
            }
            else
            {
                transform = CATransform3DRotate(transform, -radians(angle), 0.0, 1.0, 0.0);
            }

            transform = CATransform3DScale(transform, 1.0 - scale, 1.0 - scale, 0.0);
            attributes.transform3D = transform;
            attributes.alpha = 1.0;

            if(distance == 0)
            {
                attributes.zIndex = 1;
                attributes.transform3D = CATransform3DIdentity;
            }
            else
            {
                attributes.zIndex = 0;
            }
        }
    }

    return array;
}

-(CGFloat)normalizeFromMin:(CGFloat)fromMin
                   fromMax:(CGFloat)fromMax
                     toMin:(CGFloat)toMin
                     toMax:(CGFloat)toMax
                     value:(CGFloat)toNormalize
{
    CGFloat toBeDivided = toMin + (toNormalize - fromMin) * (toMax - toMin);
    CGFloat result = toBeDivided / (fromMax - fromMin);
    return result;
}

编辑:

添加
attributes.frame = attributes.frame 

就宽度而言,似乎有点帮助,但里面的表格似乎没有正确布局。看起来大小是正确的,但在旋转时,单元格只是夹住了表格,但表格本身看起来很奇怪,就像没有应用旋转一样,

最佳答案

部分修复:

- (void)scrollViewDidScroll:(UIScrollView *)aScrollView
{
    CGRect visibleRect;
    visibleRect.origin = self.collectionView.contentOffset;
    visibleRect.size = self.collectionView.bounds.size;    
    NSArray *paths = [self.collectionView indexPathsForVisibleItems];
    [paths enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        UICollectionViewCell *cell =b[self.collectionView cellForItemAtIndexPath:obj];
        [cell.contentView.subviews[0] setFrame:cell.contentView.bounds];
    }];
}

如果我将我的 Controller 设置为该方法的 Collection View 的委托(delegate),它似乎确实有效,但我希望自动布局能够启动并为我做这件事。 [cell.contentView setNeedsLayout]/[cell.contentView layoutIfNeeded] 不起作用。

关于ios - 自定义 UICollectionViewFlowLayout 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15213474/

相关文章:

iOS VideoPreview 横向颠倒

ios - JSTileMap(.tmx) 与 Xcode SKTileMapNode

ios - 如何在 ios 中根据图像动态更改 UI 按钮的宽度和高度

ios - BLKFlexibleHeightBar 行为定义器不符合 UITableViewDelegate

ios - UICollectionView 仅针对手机将单元格置于横向居中

ios - UIView 子类中的 setNeedsDisplay(在 ipad Splitview 中)不调用 drawRect

iphone - 需要对应用程序的文档文件夹中的图像进行延迟表图像加载

ios - 在 tableView 中显示数组

ios - UICollectionView 选择和取消选择问题

Swift 3 泛型 : issue with setting UICollectionViewDatasource & Delegate for a UICollectionView inside UITableViewCell