iOS/核心动画:12张重叠的卡片围成一个圆圈

iOS/核心动画:12张重叠的卡片围成一个圆圈,ios,core-animation,transform,calayer,depth-testing,Ios,Core Animation,Transform,Calayer,Depth Testing,我试着在圆圈中排列12个物体,这样每一个都与它的逆时针邻接物重叠 大概是这样的: 问题是,如果我仅仅依赖于绘图顺序,其中一个始终会完全位于顶部,在这种情况下,红色的一个在12点 我试过使用 { GlowButton* G = glowButton[ 0 ]; float theta = 0.3; G.layer.transform = CATransform3DMakeRotation( theta, 0, 1, 0 ); }

我试着在圆圈中排列12个物体,这样每一个都与它的逆时针邻接物重叠

大概是这样的:

问题是,如果我仅仅依赖于绘图顺序,其中一个始终会完全位于顶部,在这种情况下,红色的一个在12点

我试过使用

    {
        GlowButton* G = glowButton[ 0 ];

        float theta = 0.3;
        G.layer.transform = CATransform3DMakeRotation( theta, 0, 1, 0 );
    }
试图绕垂直轴旋转,从而将一侧塞在相邻一侧的后面,但这不起作用

我被告知这是因为核心动画不支持深度测试


有没有办法在不闯入德国劳埃德船级社的情况下做到这一点?

我可以想出两种方法来避免这个问题:

  • 将每个对象一分为二。首先绘制位于相邻对象后面的一半,然后在相邻对象的顶部绘制这些一半

  • 使用剪裁区域,分两步绘制圆。第一个剪辑区域将绘图限制在图片的左半部分。第二个剪裁区域限制在右半部分。每次都会绘制所有对象。但是您必须从底部或顶部元素开始


  • 我不太确定你在用核心动画做什么,所以其中一种方法可能更适合,或者需要一些调整。

    我现在可以很好地完成这项工作。不用去德国劳埃德船级社,我感到很欣慰

    我基本上画了第一块宝石(红色——12点时),带着一个面具,只让右半部分可见

    然后我画出剩下的11

    然后我再次绘制第一个,这次将遮罩设置为仅显示左半部分

        for( int i = 0; i <= 12; i++ )
        {
            for ( int dullGlow = 0; dullGlow <= 1; dullGlow++ )
            {
                BOOL isDull = ( dullGlow == 0 ) ? YES : NO;
    
                CALayer* L = [CALayer layer];
    
                CGImageRef dullImage = [ButtonImages dullImage: i % 12];
                CGImageRef glowImage = [ButtonImages glowImage: i % 12];
    
                L.contents = (id) ( isDull ? dullImage : glowImage );
    
                L.bounds = CGRectMake( 0, 0, buttonSize, buttonSize ); 
    
                L.opacity = ( isDull ? 1.0 : 0.0 );
    
                if( i == 0  ||  i == 12 )
                {
                    CGFloat halfSize = buttonSize / 2.0;
    
                    CGRect keepLeftHalf = CGRectMake( 0, 0, 
                                                     halfSize, buttonSize );
    
                    CGRect keepRightHalf = CGRectMake( halfSize,  0, 
                                                      halfSize, buttonSize );
    
                    CALayer* maskLayer = [CALayer layer];
                    maskLayer.frame = ( i == 0 ) ? keepRightHalf : keepLeftHalf;
                    maskLayer.backgroundColor = [UIColor greenColor].CGColor;
    
                    maskLayer.edgeAntialiasingMask = 0x0;
    
                    [L setMask: maskLayer];
                }
    
                [self.layer addSublayer: L];
    
                layers[ dullGlow ] [ i ] = L;
    
            } // dullGlow
    
        } // i
    

    for(inti=0;谢谢!我在这方面做了一个变体,它工作得很好。