翻转NSViews图层的坐标(CALayer)

2 cocoa core-animation

我在awakeFromNib中这样做了:

drawLayer = [CALayer layer];
self.layer = drawLayer;
[self setWantsLayer:YES];
Run Code Online (Sandbox Code Playgroud)

有一个"添加:"动作

// some  business logic

    [drawLayer addSublayer:layer];
    [self layout];

-(void)layout
while(pg = [pageEnumr nextObject])

    {
    //rect is calculated so that layers are added in order (left to right)
    [pg setFrame:rect];
    }
Run Code Online (Sandbox Code Playgroud)

我希望子图层从superLayer(视图的CALayer)的左上角添加,但它们是从左下角添加的

我试过affineTranform

   CGAffineTransform  trans = CGAffineTransformMake(1.0,0.0,0.0,-1.0,0.0,0.0);
   self.layer.affineTransform =    trans;
Run Code Online (Sandbox Code Playgroud)

但滚动让我的子层消失了

我用过变换

CATransform3D aTransform = CATransform3DIdentity;
aTransform = CATransform3DMakeRotation(M_PI, 1, 0, 0);  
self.layer..transform = aTransform; 
Run Code Online (Sandbox Code Playgroud)

我必须将变换应用于反向旋转子层,并且在添加大约100个子层之后,滚动变慢并且应用程序变得无响应

如果我不应用任何变换(没有仿射或没有变换),那么即使在添加1000个子层之后应用也很快

我的应用程序必须托管大量不同大小的层.帮助我如何使托管层采取翻转坐标...

Bra*_*son 6

如果你想翻转图层的坐标空间,我相信反转Y尺度是更好的处理方法.我做了类似的事情,以便在iPhone上反转坐标系统(以便在UIView中托管的CALayer将遵循Mac的Quartz坐标系),使用以下代码:

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);
Run Code Online (Sandbox Code Playgroud)

尝试使用此变换或应用于图层变换属性的相同变换.在我的测试中,这并没有损害任何性能.

如果您发现需要应用变换来对抗每个图层的翻转,并且这会影响性能,那么您可能只需手动计算每个图层放置的正确Y坐标.这并不难(self.layer.frame.size.height - y - newLayer.frame.size.height,我相信).