有没有办法让刻度线(主刻度标记)成为UIImage(自定义图形)而不是文本? 我有一个轴需要作为图标呈现的值。 我没有看到任何代表,但也许有人知道这个伎俩?
答案 0 :(得分:3)
接受Eric的问题并感谢他,我为他建议的解决方案提供了工作代码。 也许它有助于某人:
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
<强>享受强> 的
答案 1 :(得分:2)
轴标签可以包含任何CPTLayer
(核心动画的CALayer
的直接子类)作为其内容。将图像设置为图层背景,并使用此图层构建自定义标签。一些Core Plot示例应用程序演示了自定义标签,尽管它们都使用文本标签。
您可以使用两种方法将自定义标签添加到图表中:
使用CPTAxisLabelingPolicyNone
标签政策。创建一个包含标签的NSSet
,并将其设置为轴上的axisLabels
属性。如果您使用此功能,请记住除了自定义标签之外,您还必须提供主要和/或次要刻度线位置。
使用任何其他标签政策生成刻度线位置并实施-axis:shouldUpdateAxisLabelsAtLocations:
轴委托方法。在您的代理人中,在提供的位置创建新标签并返回NO
以取消自动标签。
埃里克