代码之家  ›  专栏  ›  技术社区  ›  Interfector

为绘图应用程序生成层结构

  •  0
  • Interfector  · 技术社区  · 14 年前

    an eralier question 我的,我试着创建一个 NSMuttableArray 成员变量保持 CALayerRef 卡拉耶勒夫 CGLayerRef 不管怎样,把他们推进我的 layers 变量,然后,当我需要它们时,获取并使用它们的上下文,最后绘制/隐藏/显示/删除它们。

    我求助于你们,伙计们,因为很明显,在网络上很少有甚至没有关于在高级水平上使用层和石英的信息。每个人都立即使用层,不需要管理,不需要成员变量。

    谢谢您。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Michal    14 年前

    下面是我在几分钟内为自定义视图编写的一些工作代码,希望能有所帮助。它创建了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