Как вы выравниваете и изменяете размер изображения CALayer?

У меня есть несколько сложное требование к макету нескольких слоев Core Animation. По сути, у меня есть два слоя с содержимым CGImage, которые необходимо изменить в размере (сохранив соотношение сторон), но при этом они располагаются рядом друг с другом в середине родительского слоя. Я проиллюстрировал это ниже.

(На обеих моих иллюстрациях показаны границы содержимого изображения слоя A и слоя B. Не имеет значения, если размер самого слоя больше.)

Желаемый макет

Самое близкое, что я сделал до сих пор, используя CAConstraintLayoutManager, — это правильно масштабировать их, но центрировать в своей половине суперслоя (ниже).

Текущий, неверный, макет

Я довожу их до этого момента с помощью кода ниже:

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, выложенный правильно, без полей по краям, а затем масштабировать его. Я тоже не могу придумать, как это сделать.


person Dov    schedule 29.06.2011    source источник


Ответы (1)


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

person Dov    schedule 29.06.2011