Ich habe versucht, uns CALayers als "Sprites" in einer iPhone-Anwendung, an der ich arbeite, zu arbeiten. Nach dem, was ich gelesen habe, scheint das hier das Richtige zu sein.Gibt es einen Grund, warum ich einen CALayer nicht außerhalb einer UIView-Klasse initialisieren kann?
Wenn ich die Ebene innerhalb einer UIView-Klasse eingerichtet habe, kann ich die Ebene auf dem Bildschirm anzeigen lassen: NSLog (@ "GameView initWithCoder");
NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"earth" ofType:@"png"];
earthImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
earthLayer = [CALayer layer];
[earthLayer setContents:(id)[earthImage CGImage]];
[earthLayer setBounds:CGRectMake(0, 0, 32, 32)];
[earthLayer setPosition:CGPointMake(50, 50)];
[earthLayer setName:@"earth"];
[[self layer] addSublayer:earthLayer];
Allerdings, wenn ich die CALayer außerhalb des UIView zu initialisieren versuchen, meine Anwendung abstürzt:
- (void)loadImage:(NSString*)fileName
{
NSLog(@"GamePiece loadImage");
NSArray* fileNameParts = [fileName componentsSeparatedByString:@"."];
imageName = [[fileNameParts objectAtIndex:0] retain];
NSString* ext = [fileNameParts objectAtIndex:1];
NSString* imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:ext];
image = [[UIImage alloc] initWithContentsOfFile:imagePath];
layer = [CALayer layer];
[layer setContents:(id)[image CGImage]];
[layer setBounds:CGRectMake(0.0f, 0.0f, 32.0f, 32.0f)];
[layer setPosition:CGPointMake(50.0f, 50.0f)];
[layer setName:imageName];
[fileNameParts release], fileNameParts = nil;
[ext release], ext = nil;
}
NSLog(@"GameView initWithCoder");
earth = [[GamePiece alloc] init];
[earth loadImage:@"earth.png"];
[[self layer] addSublayer:[earth layer]];
Klar bin ich etwas falsch hier zu tun, aber ich nur don Ich weiß nicht, was das sein würde. Ich habe den Core Animation Programming Guide und auch das iPhone Application Programming Guide gelesen, aber sie scheinen wirklich nicht darüber zu sprechen, wie man einen CALayer anders als im Vorbeigehen initialisiert.
Ich brauche nur ein sanftes Anstupsen in die richtige Richtung. Ich habe ein ziemlich gutes Verständnis über alles, was ich gelernt habe, wenn es darum geht, das iPhone zu programmieren. Ich habe nur ein paar Probleme mit Grafiken, Layern und Animationen.
Vielen Dank im Voraus!
Eigentlich ist die Schicht immer noch ein Problem, auch wenn Sie bisher Glück gehabt haben. Sie müssen es behalten, wenn es ein Ivar ist. Was den Dateinamen betrifft, habe ich das übersehen.Sie müssen das nicht wirklich behalten oder kopieren. Einfach nicht freigeben :) Grundsätzlich müssen Dinge, die Sie nur während der Dauer Ihrer Funktion verwenden, nicht aktiv verwaltet werden, es sei denn, Sie haben sie erstellt (alloc/copy/new). Dinge, die Sie beibehalten möchten, müssen aktiv verwaltet werden (wenn Sie also nicht zugewiesen/kopiert/neu sind, müssen Sie sie behalten). –