【发布时间】:2014-06-18 19:19:21
【问题描述】:
我正在创建一个 UI,其中我们有一副牌,您可以从屏幕上滑出。
我希望能够做的是创建一个 UIView 的子类来表示每张卡片,然后修改转换属性以将它们向后移动(z 轴)并向上移动一点(y 轴)以获得一副纸牌的样子。
阅读后我发现我需要使用 CATransformLayer 而不是普通的 CALayer,以使 z 轴不会变平。我通过创建一个添加到 CardDeckView 层的 CATransformLayer 对此进行了原型设计,然后将所有卡片添加到该 CATransformLayer。代码看起来有点像这样:
在初始化中:
// Initialize the CATransformSublayer
_rootTransformLayer = [self constructRootTransformLayer];
[self.layer addSublayer:_rootTransformLayer];
constructRootTransformLayer(角度方法是多余的,本来打算给甲板倾斜但后来决定不这样做):
CATransformLayer* transformLayer = [CATransformLayer layer];
transformLayer.frame = self.bounds;
// Angle the transform layer so we an see all of the cards
CATransform3D rootRotateTransform = [self transformWithZRotation:0.0];
transformLayer.transform = rootRotateTransform;
return transformLayer;
那么添加卡片的代码如下:
// Set up a CardView as a wrapper for the contentView
RVCardView* cardView = [[RVCardView alloc] initWithContentView:contentView];
cardView.layer.cornerRadius = 6.0;
if (cardView != nil) {
[_cardArray addObject:cardView];
//[self addSubview:cardView];
[_rootTransformLayer addSublayer:cardView.layer];
[self setNeedsLayout];
}
请注意,我最初想要的只是将 RVCardView 直接添加为子视图 - 我想保留仅添加图层无法执行的触摸事件。不幸的是,最终发生的情况如下:
如果我将卡片添加到 rootTransformLayer,我最终会得到正确的外观:
请注意,我尝试在根视图 (CardDeckView) 上使用 layerClass,如下所示:
+ (Class) layerClass
{
return [CATransformLayer class];
}
我已经确认根层类型现在是 CATransformLayer,但我仍然得到扁平化的外观。为了防止扁平化,我还需要做什么?
【问题讨论】:
标签: ios objective-c core-animation calayer