ios: рисование на CALayer в пользовательском приложении UITableViewCell аварийно завершает работу - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть некоторый код, который я использовал в предыдущих проектах, и там он отлично работает. Теперь я использовал этот старый код в качестве руководства для решения той же проблемы в моем текущем проекте. Проблема: тот же подход, который работал нормально, теперь приводит к сбою моего приложения. Может быть, один из вас видит, что я здесь делаю неправильно?

В моем текущем проекте у меня есть настраиваемая ячейка tableview, которая содержит пользовательский UIView под названием «VerlaufView». Я подключил все в 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.

1 Ответ

0 голосов
/ 26 ноября 2011

Хорошо, я решил проблему. Теперь это работает. Вероятно, возникла проблема с количеством ссылок. Поэтому я поместил объявление интерфейса моего делегата в заголовочный файл. Следующий код решает проблему:

#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

Хорошо, вот и все!

...