2

我在 awakeFromNib 中做到了这一点:

drawLayer = [CALayer layer];
self.layer = drawLayer;
[self setWantsLayer:YES];

有一个“添加:”动作

// 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];
    }

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

我试过仿射变换

   CGAffineTransform  trans = CGAffineTransformMake(1.0,0.0,0.0,-1.0,0.0,0.0);
   self.layer.affineTransform =    trans;

但滚动使我的子层消失

我用了变换

CATransform3D aTransform = CATransform3DIdentity;
aTransform = CATransform3DMakeRotation(M_PI, 1, 0, 0);  
self.layer..transform = aTransform; 

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

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

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

4

1 回答 1

7

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

self.layer.sublayerTransform = CATransform3DMakeScale(1.0f, -1.0f, 1.0f);

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

如果您发现需要应用变换来对抗每个图层的翻转,而这会降低性能,也许您应该手动计算每个图层放置的正确 Y 坐标。这并不难(self.layer.frame.size.height - y - newLayer.frame.size.height,我相信)。

于 2009-03-04T16:57:32.040 回答