2009-08-11 10 views
0

Ich versuche, eine separate Delegate-Klasse zu verwenden (wie viele Beispiele), um die Zeichnung eines großen Bildes in einem CATiledlayer auszuführen. Die gekachelte Ebene wurde als Unterebene in einer separaten Ansicht hinzugefügt. Ich beginne zunächst mit einem View-Controller.CATedlayer-Delegat wird nicht aufgerufen

// ImageInTiledLayerViewController.h 

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 
#import "MyView.h" 
#import "MyDelegate.h" 

@interface ImageInTiledLayerViewController : UIViewController { 
    MyView *myView; 
    MyDelegate *myDelegate; 
    CATiledLayer *tiledLayer; 
} 

@property (nonatomic, retain) MyView *myView; 
@property (nonatomic, retain) MyDelegate *myDelegate; 
@property (nonatomic, retain) CATiledLayer *tiledLayer; 

@end 

// ImageInTiledLayerViewController.m 

#import "ImageInTiledLayerViewController.h" 

@implementation ImageInTiledLayerViewController 

@synthesize myView; 
@synthesize myDelegate; 
@synthesize tiledLayer; 

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 

    // create the view 
    myView = [[MyView alloc] initWithFrame:CGRectMake(0.0, 0.0, 1200.0, 800.0)]; 
    myView.backgroundColor = [UIColor whiteColor]; 

    // delegate for the titled layer 
    myDelegate = [[MyDelegate alloc] init]; 

    // create the tiled layer 
    tiledLayer = [CATiledLayer layer]; 
    tiledLayer.frame = CGRectMake(0.0, 0.0, 1200.0, 800.0); 

    // set the tiled layers delegate for drawing 
    tiledLayer.delegate = myDelegate; 

    // add the tiled layer to the view 
    [myView.layer addSublayer:tiledLayer]; 

    // add the view to this controllers view 
    [self.view addSubview:myView]; 

    // tile layer needs layout 
    [tiledLayer setNeedsLayout]; 
} 

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

@end 

Meine Ansicht ist nur eine grundlegende Ansicht im Moment. Ich möchte dies in einer Ansicht, weil ich es später in die Bildlaufansicht hinzufügen und auf Berührungsereignisse reagieren wird.

// MyView.h 

#import <UIKit/UIKit.h> 


@interface MyView : UIView { 

} 

@end 

// MyView.m 

#import "MyView.h" 


@implementation MyView 


- (id)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     // Initialization code 
    } 
    return self; 
} 


- (void)drawRect:(CGRect)rect { 
    // Drawing code 
} 


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


@end 

Hier, wo alles schief geht ...

// MyDelegate.h 

#import <Foundation/Foundation.h> 


@interface MyDelegate : NSObject { 
    CGImageRef myImageRef; 
} 

@property (nonatomic) CGImageRef myImageRef; 

@end 


// MyDelegate.m 

#import "MyDelegate.h" 


@implementation MyDelegate 

@synthesize myImageRef; 

- (id)init { 
    // assign the image reference 
    myImageRef = [UIImage imageNamed:@"Waterfall.png"].CGImage; 
    return self; 
} 
// THIS NEVER GETS CALLED 
-(void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context { 
    // re-orientate the context 
    CGContextTranslateCTM(context, 0.0, CGImageGetHeight(myImageRef)); 
    CGContextScaleCTM(context, 1.0, -1.0); 
    CGContextDrawImage(context, CGRectMake(0.0, 0.0, CGImageGetWidth(myImageRef), CGImageGetHeight(myImageRef)), myImageRef); 
} 

@end 

Trotz meines Aufrufs setNeedsLayout für die Fliesenschicht wird die drawLayer Methode nie aufgerufen und damit das Bild nie gezogen.

+0

FEST. mein eigener dummer Fehler, ich sollte anrufen [tiledLayer setNeedsDisplay]; –

Antwort

0

Sie vermissen auch einen Aufruf von super in Ihrem Delegierten init-Methode:

if (self = [super init]) { 
    // ... 
} 
0

Sie sind neu gezeichnet CATiledLayer diese stattdessen verwenden, und Sie sollten golen sein.

-(void)drawLayer:(CATiledLayer*)layer inContext:(CGContextRef)context { 
    // re-orientate the context 
    CGContextTranslateCTM(context, 0.0, CGImageGetHeight(myImageRef)); 
    CGContextScaleCTM(context, 1.0, -1.0);  
    CGContextDrawImage(context, CGRectMake(0.0, 0.0, CGImageGetWidth(myImageRef), CGImageGetHeight(myImageRef)), myImageRef); 
}