繁体   English   中英

CALayer带来麻烦

[英]Drawing woes with CALayer

首先,就各种渲染层的方式而言,我发现iPhone在线文档不太清楚。 我明白了,但是我不清楚何时使用哪种方法以及哪种方法需要将该层添加为子层。

我的项目很简单,首先是加载图像,然后通过[image drawAtPoint:]和[image drawInRect:]将它们绘制到UIView中。 使用当前的图形上下文,它们可以正常工作。

然后,今天我碰巧阅读了使用图层的概念,因此从理论上讲,使我的各种图像(隐式地)动画化是一件轻而易举的事!

作为记录,我知道文档说对CALayer进行子类化是不必要的,但我只是这样做了。 现在,我对于应该渲染图层的不同方法感到非常困惑。

  • drawLayer
  • displayLayer
  • 显示
  • drawInContext

现在,对于所有这些方法,是否都需要设置图层的帧大小? 是否需要在视图的图层中添加图层?

给我可见结果的唯一方法是drawinContext方法。 但是,如果我应用隐式动画(例如image.opacity = 0),则什么都不会发生,这使我相信我的图层没有正确设置。

请有人将命令带回这个混乱状态。

Core Animation确实使这种事情变得微不足道。 布拉德的建议是正确的。 最重要的是,您不需要任何这些方法即可简单地渲染图层。 为了使图层渲染,请确保已完成以下操作:

  • 使用以下命令设置contents属性:

    [imageLayer setContents:(id)[[UIImage imageNamed@"image.png"] CGImage]];

  • 将图层的边界设置为所需的大小。

    [imageLayer setBounds:CGRectMake(0.0f, 0.0f, 50.0f, 50.0f)];

  • 设置要在视图中显示的图层的位置(x,y位置)。 默认的anchorPoint是图层的中心。 此代码在您的视图中将图层居中。

    [imageLayer setPosition:CGPointMake([view bounds].size.width/2, [view bounds].size.height/2)];

  • 将图层添加到视图的图层:

    [[[self view] layer] addSublayer:imageLayer];

顺便说一句,如果愿意,可以通过调用-setFrame:在一个方法中设置边界和位置。 我更喜欢自己使用这两个调用,因为这对我来说更具可读性,但这取决于您自己的偏好。 但是,如果不设置图层的边界和位置或框架,则该图层将不会渲染。

如果愿意,可以通过创建其他绘制路径,形状(请参见CAShaperLayer)或其他图像并将其添加为图像层的子层或将其添加为父层的子层并为其指定zPosition的图层来避免使用drawInContext使它们显示在图像层的前面。

现在,如果要设置不透明度的动画,则可以通过简单地按照您描述的方式设置layer属性来使用隐式动画,例如[imageLayer setOpacity:0.0f]; 这将使图层及其所有子图层在0.25秒内褪色。

只是一些其他想法。

最好的祝福。

如果您希望各层所做的全部只是显示一张图像,则根本不需要对它们进行子类化。 您应该只能够将图像(以CGImageRef形式)设置为每一层的contents属性。 然后,图层将处理该图像的绘制。 您可以使用其CGImage只读属性获取UIImage的核心图形图像表示形式。

但是,关于-drawInContext: ,您是正确的-drawInContext:在CALayer子类中放置更多自定义绘图代码的正确位置。 如果不使用CALayer子类,则可以使委托通过-drawLayer:inContext:委托方法来更改图层的绘制行为。

在Apple的《 核心动画编程指南 “提供图层内容”部分中对此进行了详细说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM