2011-06-29 6 views
2

J'ai une exigence quelque peu compliquée pour la mise en page de quelques couches d'animation de base. Fondamentalement, j'ai deux couches, avec le contenu de CGImage, qui ont besoin de redimensionner (en préservant leurs proportions), mais aussi de s'accrocher les unes aux autres au milieu de leur couche parente. Je l'ai illustré ci-dessous.Comment aligner et redimensionner une image CALayer?

(Mes deux illustrations montrent les limites de la couche A contenu d'image de B et de la couche. Peu importe si la couche elle-même est de plus grande taille.)

Desired Layout

Le plus proche que je suis venu Jusqu'à présent, utiliser CAConstraintLayoutManager permet de les mettre à l'échelle correctement, mais centré dans la moitié de la super couche (ci-dessous).

Current, incorrect, layout

Je les amener à ce point avec le code ci-dessous:

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]]; 

Comment pouvez-vous redimensionner deux couches, et aussi les aligner?

Une idée qui m'est venue à l'esprit était de créer une couche qui contenait A et B, disposées correctement, sans marge autour des bords, puis l'échelle. Je ne peux pas trouver un moyen de faire ça non plus.

Répondre

0

Je suis toujours ouvert à une meilleure réponse, mais j'ai créé ma propre sous-classe CALayoutManager, qui implémente un -layoutSublayersOfLayer personnalisé pour placer les cadres des sous-couches exactement là où je les veux. J'ai également fait une méthode +layoutManager afin que mon gestionnaire de disposition personnalisé puisse simplement être échangé pour le CAConstraintLayoutManager.

Questions connexes