为绘图应用程序创建图层结构

时间:2010-10-23 15:58:29

标签: iphone objective-c cocoa quartz-graphics

关于我的问题an eralier question,我尝试过但未能创建一个包含NSMuttableArray成员变量且持有CALayerRef的类。有人可以指导我如何做到这一点。我想要做的基本上是创建CALayerRefCGLayerRef或其他什么,将它们推入我的layers变量,然后,当我需要它们时,获取,使用它们的上下文,最后绘制/隐藏/显示/删除它们。

我转向你们,伙计们,因为很明显,在使用图层和Quartz的高级网络上,网上几乎没有任何信息。每个人都立即使用层,不需要管理,没有成员变量。

谢谢。

1 个答案:

答案 0 :(得分:1)

这是我在几分钟内编写的自定义视图的一些工作代码,希望它有所帮助。它创建了10个绿色图层,并将它们每秒动画到不同的位置。

MBLineLayerDelegate *lineLayerDelegate;
@property (nonatomic, retain) NSMutableArray *ballLayers;

- (void)awakeFromNib
{
    self.ballLayers = [NSMutableArray array];
    lineLayerDelegate = [[MBLineLayerDelegate alloc] init];
    for (NSUInteger i = 0; i < 10; i++) {
        CALayer *ball = [CALayer layer];
        CGFloat x = self.bounds.size.width * (CGFloat)random()/RAND_MAX;
        CGFloat y = self.bounds.size.height * (CGFloat)random()/RAND_MAX;
        ball.frame = CGRectMake(x, y, 20, 20);
        ball.backgroundColor = [UIColor greenColor].CGColor;
        ball.delegate = lineLayerDelegate;
        [self.layer addSublayer:ball];
        [self.ballLayers addObject:ball];
    }

    [self performSelector:@selector(animateBallsToRandomLocation) withObject:nil afterDelay:0];
}

- (void)animateBallsToRandomLocation
{
    for (CALayer *layer in self.ballLayers) {
        CGFloat x = self.bounds.size.width * (CGFloat)random()/RAND_MAX;
        CGFloat y = self.bounds.size.height * (CGFloat)random()/RAND_MAX;
        layer.position = CGPointMake(x, y);
    }
    [self performSelector:@selector(animateBallsToRandomLocation) withObject:nil afterDelay:1];
}

以下是CALayer代表的一些代码,它们描绘了一条线:

@interface MBLineLayerDelegate : NSObject {
}
- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)ctx;
@end

@implementation MBLineLayerDelegate

- (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context
{
        CGRect rect = layer.bounds;
        CGContextSaveGState(context);

        CGContextTranslateCTM(context, 0.0, rect.size.height);
        CGContextScaleCTM(context, 1.0, -1.0);
        CGContextSetAllowsAntialiasing(context, YES);
        CGContextSetShouldAntialias(context, YES);

        CGContextMoveToPoint(context, 0, 0);
        CGContextAddLineToPoint(context, rect.size.width, rect.size.height);

        CGContextRestoreGState(context);
}

@end