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é.
FIXE. ma propre faute stupide, je devrais appeler [tiledLayer setNeedsDisplay]; –