Как установить собственные значки в Core Plot на иконки? - PullRequest
1 голос
/ 19 июля 2011

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

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

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

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

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

2 голосов
/ 20 июля 2011

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

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

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

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

Эрик

...