你如何对齐和调整图像CALayer的大小?

时间:2011-06-29 16:28:00

标签: cocoa macos layout core-animation calayer

我对一些Core Animation图层的布局有一些复杂的要求。基本上,我有两层,有CGImage内容,需要调整大小(保留它们的宽高比),但也要在它们的父层中间紧挨着彼此。我在下面说明了这一点。

(我的两个插图都显示了A层和B层图像内容的界限。如果图层本身的尺寸更大则无关紧要。)

Desired Layout

我到目前为止最接近的是,使用CAConstraintLayoutManager是为了让它们正确缩放,但是以超级层的一半为中心(下图)。

Current, incorrect, layout

我通过以下代码了解到这一点:

layerA.contentsGravity = kCAGravityResizeAspect;
[layerA setConstraints:[NSArray arrayWithObjects:
                        [CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMinX],
                        [CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" kcaConstraintMidX],
                        [CAConstraint constraintWithAttribute:kCAConstraintMinY relativeTo:@"superlayer" attribute:kCAConstraintMinY],
                        [CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY],
                        nil]];

layerB.contentsGravity = kCAGravityResizeAspect;
[layerB setConstraints:[NSArray arrayWithObjects:
                        [CAConstraint constraintWithAttribute:kCAConstraintMinX relativeTo:@"superlayer" attribute:kCAConstraintMidX],
                        [CAConstraint constraintWithAttribute:kCAConstraintMaxX relativeTo:@"superlayer" kcaConstraintMaxX],
                        [CAConstraint constraintWithAttribute:kCAConstraintMinY relativeTo:@"superlayer" attribute:kCAConstraintMinY],
                        [CAConstraint constraintWithAttribute:kCAConstraintMaxY relativeTo:@"superlayer" attribute:kCAConstraintMaxY],
                        nil]];

如何调整两个图层的大小,并对齐它们?

我想到的一个想法是创建一个包含A和B的图层,布局正确,边缘没有边距,然后进行缩放。不过,我无法想办法做到这一点。

1 个答案:

答案 0 :(得分:0)

我仍然愿意接受更好的答案,但我创建了自己的CALayoutManager子类,它实现了一个自定义-layoutSublayersOfLayer,将子图层的帧精确放置在我想要的位置。我还制作了+layoutManager方法,因此我的自定义布局管理器可以简单地换成CAConstraintLayoutManager