iOS: Bekomme keine PNG Datei auf eine CALayer gemalt

T

_toom_

Aktives Mitglied
Thread Starter
Dabei seit
26.07.2006
Beiträge
391
Reaktionspunkte
5
So, ich versuche nun schon länger ein Bild in ein simples CALayer-Objekt zu malen. Dazu habe ich folgenden Miminal-Code geschrieben
Code:
#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>

@interface DrawPNGOnCALayerViewController : UIViewController {
	CGImageRef img;
	CALayer* noteLayer;
	UIImageView* imgView;
}

@end

Und die Implementation (etwas lax aber wesentlich)
Code:
#import "DrawPNGOnCALayerViewController.h"

@implementation DrawPNGOnCALayerViewController




// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
		UIImage* image = [UIImage imageNamed:@"note.png"];
		img = CGImageRetain( image.CGImage );
    }
    return self;
}


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
	
	noteLayer = [[CALayer alloc] init];	
	//[self.view.layer addSublayer:noteLayer];
	
	/*imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"note.png"]];
	[self.view addSubview:imgView];*/
}

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
	CGContextSetRGBStrokeColor(ctx, 0.f, 0.f, 0.f, 1.0);
	CGContextSetLineWidth(ctx, 1.0);
	CGContextMoveToPoint(ctx, 0.f, 10.f);
	CGContextAddLineToPoint(ctx, 200.f, 10.f);
	CGContextStrokePath(ctx);
	
}

- (void)viewWillAppear:(BOOL)animated {
	/*
	noteLayer.delegate = self;
	noteLayer.bounds = CGRectMake(0.f, 0.f, 200.f, 200.f);
	noteLayer.backgroundColor = [[UIColor blueColor] CGColor];
	noteLayer.position = self.view.center;
	[noteLayer setNeedsDisplay];
	*/
	
	noteLayer.delegate = self;
	noteLayer.bounds = CGRectMake( 0.f,0.f, CGImageGetWidth(img),CGImageGetHeight(img));
	noteLayer.frame = CGRectMake(0.,0.,CGImageGetWidth(img),CGImageGetHeight(img));
	noteLayer.contents = (id)img;
	noteLayer.position = CGPointMake( 50.f,50.f );
	[noteLayer setNeedsDisplay];
}

- (void)didReceiveMemoryWarning {
	// Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
	
	// Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
	// Release any retained subviews of the main view.
	// e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}

@end

1. Wenn ich den Code so umkommentiere, dass die UIImageView dargestellt wird, dann wird note.png korrekt angezeigt.

2. Wenn ich in viewWillAppear den ersten Codeblock einkommentiere und den zweiten auskommentiere, dann wird ein Feld 200x200 groß mit blauem Hintergrund gemalt und darauf eine Linie, funktioniert also korrekt.

3. Wenn ich das Programm so ausführe, wie es oben steht, dann wird einfach nix gemalt und ich weiss absolut nicht warum. Hab das nach einem Beispiel auf dem Apple Developer Seiten gemacht Klicke hier.

Kann mir jemand erklären warum die Grafik nicht gemalt wird?
 
Nicht, dass ich mich damit wirklich auskennen würde, aber: Bist du denn sicher, dass dein Bild (img) zur Laufzeit gesetzt ist? Kannst du es im Debugger sehen und bekommst du mit
Code:
CGImageGetWidth(img)
bzw.
Code:
CGImageGetHeight(img)
dort auch passende / erwartete Werte?
 
Mmhh komisch. Deine Vermutung stimmt. Deshalb habe ich den Code umgeändert wie folgt:

Code:
- (void)viewWillAppear:(BOOL)animated {
	/*
	noteLayer.delegate = self;
	noteLayer.bounds = CGRectMake(0.f, 0.f, 200.f, 200.f);
	noteLayer.backgroundColor = [[UIColor blueColor] CGColor];
	noteLayer.position = self.view.center;
	[noteLayer setNeedsDisplay];
	*/
	
	UIImage* image = [UIImage imageNamed:@"note.png"];
	img = CGImageRetain( image.CGImage );
	
	noteLayer.delegate = self;
	noteLayer.bounds = CGRectMake( 0.f,0.f, CGImageGetWidth(img),CGImageGetHeight(img));
	noteLayer.frame = CGRectMake(0.,0.,CGImageGetWidth(img),CGImageGetHeight(img));
	NSLog(@"img = %f,%f",CGImageGetWidth(img),CGImageGetHeight(img));
	noteLayer.contents = (id)img;
	noteLayer.position = CGPointMake( 50.f,50.f );
	[noteLayer setNeedsDisplay];
}

D.h. ich lade die Bilddaten jetzt in derselben Methode in der ich auch noteLayer mit Attributen setzte. Allerdings wird das Bild nach wie vor nicht ausgegeben. NSLog liefert mir folgende merkwürdig Ausgabe in der Konsole:
2010-10-21 10:53:58.471 DrawPNGOnCALayer[69681:207] img = 0.000000,8388608.000000

Wenn ich einen Breakpoint in der "viewWillAppear"-Methode setze und dann die Maus über img halte, dann zeigt er mir zumindest mal eine Speicheradresse an.

Trotzdem die Ausgabe ist ist sinnlos. Irgendwas stimmt noch nicht.
 
... wie gesagt, ich kenn mich eigentlich nicht aus, ich hatte nur deinen Code gelesen und fand es gefährlich, auf ein Objekt zuzugreifen, ohne vorher zu prüfen, ob es initialisiert wurde....

Da deine Logausgabe scheinbar Breite und Höhe des Bildes ausgibt, ist es aber nicht verwunderlich, dass nix gezeichnet wird, bzw. ein Bild mit Breite 0 ist halt schwer zu erkennen...

Jetzt sollte evtl. jemand berufeneres helfen (ich hab ja noch nicht mal die passende Entwicklungsumgebung hier ;-)

Viel Glück!
ruerueka
 
Nur so aus Neugierde: hast du es gelöst bekommen?
 
Z.B. so:
Im Interface
Code:
@interface DrawPNGOnCALayerViewController : UIViewController {
        CALayer* mainLayer;
	CGImageRef bImg;
	CALayer* bLayer;
}
@end

In der Implementation:
Code:
- (void)viewDidLoad {
        mainLayer = [[CALayer alloc] init];
	mainLayer.delegate = self;
	mainLayer.bounds = CGRectMake( 0.f, 0.f, mainLayerWidth, mainLayerHeight );
	mainLayer.backgroundColor = [[UIColor whiteColor] CGColor];
        [self.view.layer insertSublayer:mainLayer above:self.view.layer];
	[mainLayer setNeedsDisplay];

        UIImage* bImage = [UIImage imageNamed:@"b.png"];
	bImg = CGImageRetain( bImage.CGImage );
	bLayer = [[CALayer alloc] init];
	bLayer.delegate = self;
	bLayer.bounds = CGRectMake( 0.f, 0.f, CGImageGetWidth( bImg), CGImageGetHeight( bImg) );
	bLayer.contents = (id)bImg;
	[mainLayer insertSublayer:bLayer above:mainLayer];
...
}
 
  • Gefällt mir
Reaktionen: DarkAge
Zurück
Oben Unten