【问题标题】:Transforming UICollectionViewCell causes touch events not be captured转换 UICollectionViewCell 导致无法捕获触摸事件
【发布时间】:2014-09-22 20:24:01
【问题描述】:

我试图通过子类化 UICollectionViewFlowLayout 创建一个水平集合视图。 中心单元格被放大一点以集中在视图上。

查看屏幕截图:

但 UICollectionViewCell 不捕获触摸事件。我的意思是当我点击单元格时,不会调用委托方法- (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);

}

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    缩放是使用乘法计算的,所以为了导致“z轴上没有变换”,值应该是1,而不是0

    【讨论】:

      【解决方案2】:

      我也必须沿 Z 轴缩放单元格

      transform = CATransform3DScale(transform, zoom, zoom, zoom);
      

      单元格触摸事件有效。

      有谁知道为什么需要沿 Z 轴缩放?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-17
        • 1970-01-01
        相关资源
        最近更新 更多