J'ai essayé de développer un objet « Vignettes » à base CALayer
qui a deux couches qui font face à l'un de l'autre pour présenter les deux côtés d'une carte. Je travaille avec des choses comme la propriété doublesided
du CALayer
et de trouver les résultats à confusion. Ma classe de base est CALayer
et j'ajouter deux sublayers
à lui, l'un avec un M_PI/2 transformer et à la fois avec doublesided = NO
mais tel qu'il est, je reçois la projection avant, peu importe la façon dont je tourne la carte et l'arrière ne montre pas du tout. Si je ne crée pas le devant, le dos montre à travers les deux côtés et le texte est dans un coin, pas 48 points et flou.Essayer de faire une carte de CALayers qui peut se retourner sur
Voici un lien vers une capture d'écran montrant la carte en train de terminer une révolution complète dans une vue UIViewController's
. Vous voyez l'arrière du front. Cela devrait être invisible, et le dos doit être montrer ... Je pense ...
https://files.me.com/gazelips/lj2aqo
// CardView.h
#import <Foundation/Foundation.h>
#import <QuartzCore/QuartzCore.h>
#define kCardWidth 100.0f
#define kCardHeight 150.0f
@interface CardView : CALayer {
CALayer *cardFront, *cardBack;
}
@property (nonatomic, retain) CALayer *cardFront, *cardBack;
- (id)initWithPosition:(CGPoint)point;
- (void)addPerspective;
- (CALayer *)createFront;
- (CALayer *)createBack;
@end
// CardView.m
#import "CardView.h"
@implementation CardView
@synthesize cardFront, cardBack;
static CATransform3D kPerspectiveTransform;
- (id)initWithPosition:(CGPoint)point {
NSLog(@"--initWithPosition:CardView");
self = [super init];
if (self != nil) {
[self addPerspective];
self.bounds = CGRectMake(0, 0, kCardWidth, kCardHeight);
self.position = point;
self.edgeAntialiasingMask = 0;
self.backgroundColor = [[UIColor clearColor] CGColor];
self.borderColor = [[UIColor blackColor] CGColor];
self.borderWidth = 0.5;
self.doubleSided = YES;
cardBack = [self createBack];
[self addSublayer: cardBack];
cardFront = [self createFront];
[self addSublayer: cardFront];
}
return self;
}
- (void)addPerspective {
NSLog(@"--prepare:CardView");
kPerspectiveTransform = CATransform3DIdentity;
kPerspectiveTransform.m34 = -1.0/800.0;
self.transform = kPerspectiveTransform;
}
- (CALayer *)createFront {
NSLog(@"--createFront:CardView");
CALayer *front = [[CALayer alloc] init];
front.bounds = CGRectMake(0.0f, 0.0f, kCardWidth, kCardHeight);
front.position = CGPointMake(kCardWidth/2, kCardHeight/2);
front.edgeAntialiasingMask = 0;
front.backgroundColor = [[UIColor whiteColor] CGColor];
front.cornerRadius = 8 * (kCardHeight/150);
front.borderWidth = 1;
front.borderColor = [[UIColor grayColor] CGColor];
front.doubleSided = NO;
return [front autorelease];
}
- (CALayer *)createBack {
NSLog(@"--createBack:CardView");
CALayer *back = [[CALayer alloc] init];
back.bounds = CGRectMake(0.0f, 0.0f, kCardWidth, kCardHeight);
back.position = CGPointMake(kCardWidth/2, kCardHeight/2);
back.backgroundColor = [[UIColor blueColor] CGColor];
back.contentsGravity = kCAGravityResize;
back.masksToBounds = YES;
back.borderWidth = 4 * (kCardHeight/150);
back.borderColor = [[UIColor grayColor] CGColor];;
back.cornerRadius = 8 * (kCardHeight/150);
back.edgeAntialiasingMask = 0;
back.doubleSided = NO;
CATextLayer *textLayer = [CATextLayer layer];
textLayer.font = [UIFont boldSystemFontOfSize:48];
textLayer.bounds = CGRectMake(0.0f, 0.0f, kCardWidth, kCardHeight);
textLayer.position = CGPointMake(50.0f, 75.0f);
textLayer.string = @"Steve";
[back addSublayer:textLayer];
back.transform = CATransform3DMakeRotation(M_PI, 0.0f, 1.0f, 0.0f);
return [back autorelease];
}
@end
Si vous cherchez un bon tutoriel à ce sujet, cela m'a vraiment aidé: http://invasivecode.tumblr.com/post/29307073330/core-animation-transform-layer – Marc
A dû remettre en cause ceci non seulement parce que c'est la bonne réponse, mais aussi pour l'utilisation de "six façons de dimanche" – ribeto