【问题标题】:Flipping the co-ordinates of NSViews layer (CALayer)翻转NSViews层的坐标(CALayer)
【发布时间】:2009-03-04 16:37:17
【问题描述】:

我在 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; 

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

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

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

【问题讨论】:

    标签: cocoa core-animation


    【解决方案1】:

    如果你想翻转图层的坐标空间,我相信反转 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,我相信)。

    【讨论】:

    • 不要忘记移动原点,这样您就不会简单地进入负空间。将 y 平移图层的高度,然后按您显示的方式缩放。
    • 有了UIViews,我发现在将上面的sublayerTransform应用到UIView的托管层时,不需要在Y中翻译。当我读到它时,图层的默认锚点是它的中心,这就是应用变换的目的。
    • 不过,你是对的。通常,您确实需要 Y 翻译。
    • 哇布拉德,我看到它工作正常,但我正在反翻转每个子层,但到目前为止性能很好,我还在考虑优化它。一旦我找到它,我会更新线程,谢谢。
    • @RhythmicFistman - 我必须做同样的事情。我不记得是否有其他图层类型可以做到这一点,但我记得我必须根据平台取消翻转那些文本图层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    相关资源
    最近更新 更多