【问题标题】:ios: Drawing on CALayer in custom UITableViewCell crashes appios:在自定义 UITableViewCell 中绘制 CALayer 崩溃应用程序
【发布时间】:2011-11-25 13:49:13
【问题描述】:

我有一些我在以前的项目中使用过的代码,它运行良好。现在,我使用该旧代码作为解决当前项目中相同问题的指南。问题:现在可以正常工作的相同方法使我的应用程序崩溃。也许你们中的一个看到我在这里做错了什么?

在我当前的项目中,我有一个自定义的 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”,这将是处理 calayer 上的绘图的委托。

#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”方法时崩溃了。

【问题讨论】:

    标签: ios uitableview calayer


    【解决方案1】:

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

    #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
    

    好的,就是这样!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多