首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用CATiledlayer委托

未调用CATiledlayer委托
EN

Stack Overflow用户
提问于 2009-08-11 12:42:24
回答 2查看 1.6K关注 0票数 0

我正在尝试使用一个单独的委托类(就像许多示例一样)在CATiledlayer中执行大图像的绘制。平铺图层已添加为单独视图中的子图层。我首先从一个视图控制器开始。

代码语言:javascript
复制
//  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

我的观点目前只是一个基本观点。我想把它放在视图中,因为我稍后会把它添加到滚动视图中,它会对触摸事件做出响应。

代码语言:javascript
复制
//  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

这就是问题所在。

代码语言:javascript
复制
//  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

尽管我为tile层调用了setNeedsLayout,但从未调用过drawLayer方法,因此也从未绘制过图像。

EN

回答 2

Stack Overflow用户

发布于 2009-12-16 20:41:41

在你的委托的init方法中,你也错过了对super的调用:

代码语言:javascript
复制
if (self = [super init]) {
    // ...
}
票数 0
EN

Stack Overflow用户

发布于 2011-05-06 04:51:56

你正在重画CATiledLayer,用这个代替,你应该是golen。

代码语言:javascript
复制
-(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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1260105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档