2009-08-11 7 views
0

J'essaie d'utiliser une classe de délégué distincte (comme beaucoup d'exemples le font) pour effectuer le dessin d'une grande image dans un CATiledlayer. La couche mosaïque a été ajoutée en tant que sous-couche dans une vue séparée. Je commence d'abord avec un contrôleur de vue.Le délégué CATiledlayer n'est pas appelé

// 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 

Ma vue est juste une vue basique pour le moment. Je veux cela dans une vue parce que je vais l'ajouter pour faire défiler la vue plus tard et il répondra aux événements tactiles.

// 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 

est ici où tout va mal ...

// 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 

Malgré mon appel à setNeedsLayout pour la couche de tuiles la méthode drawLayer est jamais appelé et d'où l'image est jamais dessiné.

+0

FIXE. ma propre faute stupide, je devrais appeler [tiledLayer setNeedsDisplay]; –

Répondre

0

Vous manquez également un appel à super dans la méthode init de votre délégué:

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

Vous êtes redessiner CATiledLayer utiliser ce lieu, et vous devriez être golen.

-(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); 
} 
Questions connexes