ios - 转换 UICollectionViewCell 导致无法捕获触摸事件

标签 ios objective-c uicollectionview core-animation touch-event

我正在尝试通过子类化 UICollectionViewFlowLayout 来创建水平 Collection View 。 其中中心单元格被缩放得更多一点以专注于 View 。

看截图:

enter image description here

但 UICollectionViewCell 不捕获触摸事件。我的意思是,当我点击单元格时,委托(delegate)方法 - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 不会被调用。 但是当我从单元格中删除比例变换时,上面的方法被调用了!

#import "CoverFlowLayout.h"

static const CGFloat kMaxDistancePercentage = 0.3f;
static const CGFloat kMaxRotation = (CGFloat)(50.0 * (M_PI / 180.0));
static const CGFloat kMaxZoom = 0.1f;

@implementation CoverFlowLayout

- (id)init {
    if ((self = [super init])) {
        self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
        self.minimumLineSpacing = 10000.0f; }
    return self;
}

- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {

    // 1
    CGRect visibleRect =
    (CGRect){.origin = self.collectionView.contentOffset,
        .size = self.collectionView.bounds.size};
    CGFloat maxDistance =
    visibleRect.size.width * kMaxDistancePercentage;
    // 2
    NSArray *array =
    [super layoutAttributesForElementsInRect:rect];
    for (UICollectionViewLayoutAttributes *attributes in array) {
        // 3
        CGFloat distance =
        CGRectGetMidX(visibleRect) - attributes.center.x;
        // 4
        CGFloat normalizedDistance = distance / maxDistance;
        normalizedDistance = MIN(normalizedDistance, 1.0f);
        normalizedDistance = MAX(normalizedDistance, -1.0f);
        // 5
        CGFloat rotation = normalizedDistance * kMaxRotation;
        CGFloat zoom = 1.0f + ((1.0f - ABS(normalizedDistance)) * kMaxZoom);
        // 6
        CATransform3D transform = CATransform3DIdentity;
        transform.m34 = 1.0 / -1000.0;
        //transform = CATransform3DRotate(transform,
          //                             rotation, 0.0f, 1.0f, 0.0f);

        transform = CATransform3DScale(transform, zoom, zoom, 0.0f);
        attributes.transform3D = transform;
    }
    // 7
    return array;
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
    return YES;
}

- (CGPoint)targetContentOffsetForProposedContentOffset: (CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
    // 1
    CGFloat offsetAdjustment = CGFLOAT_MAX;
    CGFloat horizontalCenter = proposedContentOffset.x +
    (CGRectGetWidth(self.collectionView.bounds) / 2.0f);
    // 2
    CGRect targetRect = CGRectMake(proposedContentOffset.x,
                                   0.0f, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);
    NSArray *array =
    [super layoutAttributesForElementsInRect:targetRect];
    for (UICollectionViewLayoutAttributes* layoutAttributes in array)
    {
        // 3
        CGFloat distanceFromCenter = layoutAttributes.center.x - horizontalCenter;
        if (ABS(distanceFromCenter) < ABS(offsetAdjustment))
        {
            offsetAdjustment = distanceFromCenter;
        }
    }
    // 4
    return CGPointMake(proposedContentOffset.x + offsetAdjustment,
                   proposedContentOffset.y);

}

有什么想法吗?

最佳答案

您不需要在 z 轴上缩放,问题是因为您在 z 轴上缩放到零

z轴上的刻度应该大于零;将其设置为零会导致按钮“没有深度”,因此无法识别触摸。 (虽然你仍然可以看到按钮)

缩放是使用乘法计算的,因此为了“在 z 轴上无变换”,该值应为 1,而不是 0

关于ios - 转换 UICollectionViewCell 导致无法捕获触摸事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25982581/

相关文章:

ios - 如何将 String.UTF8View.Index 转换为 String.CharacterView.Index?

iphone - 如何在 AVAudioPlayer 播放器对象中继承或存储额外信息

ios - 将图像异步加载到 UICollectionView?

swift - 如何在拖动项目时更改预览图像

iphone - textFieldDidBeginEditing - 不工作

ios - Xcode iOS Base SDK 缺失

iOS错误: Thread 1:EXC_BAD_ACCESS(code=1,地址=0x726f635f)?

ios - UICollectionView VS UITableview

ios - 分支 io 深层链接在测试环境中不起作用(使用相同的代码在 LIVE 中工作)

objective-c - 如何将框架添加到xcode