2009-08-11 4 views
0

Я пытаюсь использовать отдельный класс делегата (как это многие примеры) для выполнения чертежа большого изображения в CATiledlayer. Слоистый слой был добавлен в качестве подслоя в отдельном виде. Сначала я начинаю с контроллера вида.Недопустимый вызов делегата CATiledlayer

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

Мое мнение является основным видом на данный момент. Я хочу это в представлении, потому что я добавлю его для просмотра прокрутки позже, и он будет реагировать на события касания.

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

Вот где все это идет не так ...

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

Несмотря на мой призыв к setNeedsLayout для плитки слоя метод drawLayer никогда не называется и, следовательно, изображение никогда не обращается.

+0

FIXED. моя собственная немая ошибка, я должен позвонить [tiledLayer setNeedsDisplay]; – 2009-08-12 08:55:26

ответ

0

Вы также пропустить вызов супер в методе инициализации вашего делегата:

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

Вы перерисовки CATiledLayer использовать это вместо того, чтобы, и вы должны быть 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); 
}