Как вы выровняете и измените размер изображения CALayer? - PullRequest
2 голосов
/ 29 июня 2011

У меня есть несколько сложное требование для размещения нескольких слоев 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 голосов
/ 29 июня 2011

Я все еще открыт для лучшего ответа, но я создал свой собственный подкласс CALayoutManager, который реализует пользовательский -layoutSublayersOfLayer для размещения фреймов подслоев именно там, где я их хочу.Я также сделал метод +layoutManager, чтобы мой собственный менеджер компоновки можно было просто заменить на CAConstraintLayoutManager.

...