我需要在一个圆圈中布置几个“按钮”集合。我发现使用自定义布局流程的UICollectionView是一种简单的方法来实现这一目标。特别是因为每个按钮集合的数量不尽相同。
此外,这个按钮轮需要像摩天轮一样旋转(尽管很慢)。也就是说,每个单元在“轮”旋转时保持其方向。所以我已经为每个uicollectionviewcell添加了一个CAKeyFrameAnimation。
现在的问题是我在移动时失去了选择单元格的能力。当然,这是因为单元格实际上仍处于原始位置,只有表示层是动画的。
我已经看到了为关键帧动画视图添加hittests的建议,但对collectionviewcell执行此操作似乎完全取消了使用uicollectionview的要点。感觉就像走下了一条道路。
我在这里遗漏了什么吗?我觉得我应该为这个应用程序完全放弃UICollectionViews,并在CALayer上使用简单的uiviews和hitTesting。不幸的是,虽然我必须重新发明许多集合视图的便利。
答案 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];
}