Как установить пользовательские галочки в Core Plot на значки?

Есть ли способ сделать отметку (основную отметку) UIImage (пользовательская графика) вместо текста? У меня есть значения на одной из осей, которые мне нужно представить в виде значков. Я не вижу делегата для этого, но, может быть, кто-то знает хитрость?


person Lukasz    schedule 19.07.2011    source источник


Ответы (2)


Метки оси могут иметь любой CPTLayer (который является прямым подклассом CALayer Core Animation) в качестве своего содержимого. Установите свое изображение в качестве фона слоя и создайте пользовательскую метку, используя этот слой. Несколько примеров приложений Core Plot демонстрируют настраиваемые метки, хотя все они используют текстовые метки.

У вас есть два варианта добавления пользовательских меток к графику:

  1. Используйте политику маркировки CPTAxisLabelingPolicyNone. Создайте NSSet, содержащий ваши метки, и установите для него свойство axisLabels на оси. Если вы используете это, помните, что вы должны указать основные и/или второстепенные местоположения делений в дополнение к пользовательским меткам.

  2. Используйте любую другую политику маркировки, чтобы сгенерировать местоположения делений и реализовать метод делегата оси -axis:shouldUpdateAxisLabelsAtLocations:. В своем делегате создайте новые метки в указанных местах и ​​верните NO, чтобы отключить автоматические метки.

Эрик

person Eric Skroch    schedule 19.07.2011
comment
Ваш ответ завел меня довольно далеко, но у меня проблема с рисованием самой иконки на CPLayer. CPLayer отрисовывается правильно, но без изображения (содержимое слоя). См. обновление вопроса с используемым кодом. - person Lukasz; 20.07.2011
comment
Когда вы говорите создавать новые метки в указанных местах, вы имеете в виду свойство tickLocation, верно? Я устанавливал их в своем делегате на основе аргумента от делегата (местоположения), но все они настроены на местоположение = 0. - person Maverick; 05.02.2012

Приняв вопрос Эрика и поблагодарив его, я предоставил рабочий код для предложенного им решения. Может кому поможет:

if (yAxisIcons) {


    int custonLabelsCount = [self.yAxisIcons count];

    NSMutableArray *customLabels = [NSMutableArray arrayWithCapacity:custonLabelsCount];

    for (NSUInteger i = 0; i < custonLabelsCount; i++) {

        NSNumber *tickLocation = [NSNumber numberWithInt:i];
        NSString *file = [yAxisIcons objectAtIndex:i];
        UIImage *icon = [UIImage imageNamed:file];

        CPImageLayer *layer; // My custom CPLayer subclass - see code below

          CGFloat nativeHeight = 1;
          CGFloat nativeWidth = 1;


        if (icon) {

            layer = [[CPImageLayer alloc] initWithImage:icon];
            nativeWidth = 20;//CGImageGetWidth(icon.CGImage);
            nativeHeight = 20;//CGImageGetHeight(icon.CGImage);
            //layer.contents = (id)icon.CGImage;

            if (nativeWidth > biggestCustomIconWidth) {
                biggestCustomIconWidth = nativeWidth;
            }

        }else{
            layer = [[CPImageLayer alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
        }

            CGRect  startFrame = CGRectMake(0.0, 0.0, nativeWidth, nativeHeight);

            layer.frame = startFrame;
            layer.backgroundColor = [UIColor clearColor].CGColor;
            CPAxisLabel *newLabel = [[CPAxisLabel alloc] initWithContentLayer:layer];
            newLabel.tickLocation = [tickLocation decimalValue];
            newLabel.offset = x.labelOffset + x.majorTickLength;
            [customLabels addObject:newLabel];
            [newLabel release];
            [layer release];

    }

    y.axisLabels =  [NSSet setWithArray:customLabels];

}

CPImageLayer.h

#import "CPLayer.h"

@interface CPImageLayer : CPLayer {

    UIImage *_image;

}
-(id)initWithImage:(UIImage *)image;
@end

CPImageLayer.m

#import "CPImageLayer.h"
#import "CPLayer.h"

@implementation CPImageLayer

-(void)dealloc{

    [_image release];
    [super dealloc];
}
-(id)initWithImage:(UIImage *)image{

    CGRect f = CGRectMake(0, 0, image.size.width, image.size.height);

    if (self = [super initWithFrame:f]) {

        _image = [image retain];
    }

    return self;

}

-(void)drawInContext:(CGContextRef)ctx{

    CGContextDrawImage(ctx, self.bounds, _image.CGImage);

}
@end

Наслаждайтесь

person Lukasz    schedule 22.07.2011