2011-11-25 72 views
0

我有一些代码,我在以前的项目中使用,并在那里工作正常。现在我使用这些旧代码作为解决当前项目中相同问题的指导原则。问题:现在正常工作的方法现在会崩溃我的应用程序。也许你们中的一个人看到我在这里做错了什么?ios:在自定义UITableViewCell崩溃应用程序中绘制CALayer

在我当前的项目中,我有一个自定义tableviewcell,它包含一个名为“VerlaufView”的自定义UIView。我在Interface Builder中连接了所有东西,并检查了它的工作正常。因此,这里是我的自定义的UIView:

接口定义:

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@interface VerlaufView : UIView { 
    CALayer* mainLayer; 
} 

@property (strong,nonatomic) CALayer* mainLayer; 

-(void) initialisieren; 

@end 

这是落实。请注意,该实现包含内部类“VerlaufDelegate”,这将成为处理图层上的图形的代理。

#import "VerlaufView.h" 


static bool debug = YES; 

#pragma mark VerlaufDelegate 
@interface VerlaufDelegate : NSObject { 
    UIView* layersParent; 
} 

@property (nonatomic,strong) UIView* layersParent; 

-(id)initWithView:(UIView*)view; 

@end 

@implementation VerlaufDelegate 
@synthesize layersParent; 


-(id)initWithView:(UIView*)view { 
    if(debug) NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__); 
    self = [super init]; 
    if(self) 
     self.layersParent = view; 
    if(debug) NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__); 
    return self; 
} 


- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx { 
    if(debug) NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__); 
    if(debug) NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__); 
} 

@end 




@implementation VerlaufView 

@synthesize mainLayer; 

-(void) initialisieren 
{ 
    if(debug) NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__); 
    VerlaufDelegate* layerDelegate = [[VerlaufDelegate alloc] initWithView:self]; 
    float width = 200; //320; 
    float height = 100; //259; 

    //Hauptlayer 
    mainLayer = [[CALayer alloc] init]; 
    mainLayer.delegate = layerDelegate; 

    mainLayer.bounds = CGRectMake(0.f, 0.f, width, height); 
    /*mainLayer.backgroundColor = [[UIColor whiteColor] CGColor]; 
    mainLayer.cornerRadius = 10.f; 
    CGFloat components[4] = { 0.0, 0.0, 0.0, 1.0 }; 


    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    CGColorRef black = CGColorCreate(colorspace, components); 
    mainLayer.borderColor = black; 
    mainLayer.borderWidth = 1.f; 
    mainLayer.shadowRadius = 5.f; 
    mainLayer.shadowColor = black; 

    CGColorRelease(black); 
    CGColorSpaceRelease(colorspace); 

    mainLayer.shadowOffset = CGSizeMake(0.f, 5.f), 
    mainLayer.shadowOpacity = 0.75f; 
    */ 

    [self.layer insertSublayer:mainLayer above:self.layer]; 
    [mainLayer setNeedsDisplay]; 
    if(debug) NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__); 
} 
@end 

所以我的代码在处理“initialisieren”方法时崩溃。

回答

0

好的,我解决了这个问题。现在它可以工作。引用计数可能存在问题。因此,我将我的委托的接口声明放入头文件中。下面的代码解决了这个问题:

#import <UIKit/UIKit.h> 
#import <QuartzCore/QuartzCore.h> 

@class VerlaufDelegate; 

@interface VerlaufCell : UITableViewCell { 
    VerlaufDelegate* layerDelegate; 
} 

@property (strong,nonatomic) VerlaufDelegate* layerDelegate; 

@end 


#pragma mark VerlaufDelegate 
@interface VerlaufDelegate : NSObject { 
    UIView* layersParent; 
} 

@property (nonatomic,strong) UIView* layersParent; 

-(id)initWithView:(UIView*)view; 

@end 

和实现:

#import "VerlaufCell.h" 

static bool debug = YES; 

@implementation VerlaufDelegate 
@synthesize layersParent; 


-(id)initWithView:(UIView*)view { 
    if(debug) NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__); 
    self = [super init]; 
    if(self) 
     self.layersParent = view; 
    if(debug) NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__); 
    return self; 
} 


- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx { 
    if(debug) NSLog(@">>> Entering %s <<<", __PRETTY_FUNCTION__); 

    NSString* text = @"VerlaufCellDelegate"; 
    float h = 20.f; 

    CGContextSelectFont(ctx, "Helvetica-Bold", h, kCGEncodingMacRoman); 
    //CGContextSetCharacterSpacing(ctx, 10); 
    CGContextSetTextDrawingMode(ctx, kCGTextFillStroke); 
    CGContextSetRGBFillColor(ctx, 1, 1, 1, 1); 
    CGContextSetRGBStrokeColor(ctx, 0, 0, 0, 1); 

    CGAffineTransform transform; 
    transform.a = 1; 
    transform.b = 0; 
    transform.c = 0; 
    transform.d = -1; 
    transform.tx = 0; 
    transform.ty = 0; 
    CGContextSetTextMatrix(ctx, transform); 

    CGContextShowTextAtPoint(ctx, 50, 25, [text cStringUsingEncoding:NSASCIIStringEncoding], [text length]);  


    if(debug) NSLog(@">>> Leaving %s <<<", __PRETTY_FUNCTION__); 
} 

@end 


@implementation VerlaufCell 

@synthesize layerDelegate; 

- (id) initWithCoder:(NSCoder *)aDecoder { 
    self = [super initWithCoder:aDecoder]; 
    if(self) { 
     self.layerDelegate = [[VerlaufDelegate alloc] initWithView:self.contentView]; 

     CALayer *customDrawn = [CALayer layer]; 
     customDrawn.delegate = self.layerDelegate; 
     customDrawn.backgroundColor = [UIColor greenColor].CGColor; 
     customDrawn.frame = CGRectMake(10, 10, 300, 230); 
     customDrawn.shadowOffset = CGSizeMake(0, 3); 
     customDrawn.shadowRadius = 5.0; 
     customDrawn.shadowColor = [UIColor blackColor].CGColor; 
     customDrawn.shadowOpacity = 0.8; 
     customDrawn.cornerRadius = 10.0; 
     customDrawn.borderColor = [UIColor blackColor].CGColor; 
     customDrawn.borderWidth = 2.0; 
     customDrawn.masksToBounds = YES; 
     [[self layer] addSublayer:customDrawn]; 
     [customDrawn setNeedsDisplay]; 
    } 
    return self; 
} 

@end 

好了,这就是它!