动画UICollectionViewCells

时间:2013-12-20 17:18:39

标签: ios animation uicollectionviewcell cakeyframeanimation

我需要在一个圆圈中布置几个“按钮”集合。我发现使用自定义布局流程的UICollectionView是一种简单的方法来实现这一目标。特别是因为每个按钮集合的数量不尽相同。

此外,这个按钮轮需要像摩天轮一样旋转(尽管很慢)。也就是说,每个单元在“轮”旋转时保持其方向。所以我已经为每个uicollectionviewcell添加了一个CAKeyFrameAnimation。

现在的问题是我在移动时失去了选择单元格的能力。当然,这是因为单元格实际上仍处于原始位置,只有表示层是动画的。

我已经看到了为关键帧动画视图添加hittests的建议,但对collectionviewcell执行此操作似乎完全取消了使用uicollectionview的要点。感觉就像走下了一条道路。

我在这里遗漏了什么吗?我觉得我应该为这个应用程序完全放弃UICollectionViews,并在CALayer上使用简单的uiviews和hitTesting。不幸的是,虽然我必须重新发明许多集合视图的便利。

1 个答案:

答案 0 :(得分:0)

如果'旋转'是视图的固有属性,覆盖hitTest以反映此属性对我来说似乎完全有效。

我建议将UICollectionView和每个单元格包装成UIView - 派生RotatingView,顺时针旋转一个,另一个逆时针旋转相同的速度(你可能已经这样做了。)

然后在hitTest中覆盖RotatingView以及以下内容:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CATransform3D transform = ((CALayer*)self.layer.presentationLayer).transform;
    CGFloat a = atan2(transform.m12, transform.m11);
    CGPoint offsetPoint = CGPointMake(point.x - CGRectGetWidth(self.frame)*0.5, point.y - CGRectGetHeight(self.frame)*0.5);
    CGPoint rotatedPoint = CGPointApplyAffineTransform(offsetPoint, CGAffineTransformMakeRotation(M_PI-a));
    CGPoint inverseOffsetRotatedPoint = CGPointMake(rotatedPoint.x + CGRectGetWidth(self.frame)*0.5, rotatedPoint.y + CGRectGetHeight(self.frame)*0.5);
    return [super hitTest:inverseOffsetRotatedPoint withEvent:event];
}