使用蒙版在CALayer上隐藏动画

时间:2010-03-05 08:21:09

标签: objective-c core-animation uiimage calayer mask

我想在图像上创建一个“盲目”效果,以便图像“向下”并显示。

有点像这样的JavaScript转换: http://wiki.github.com/madrobby/scriptaculous/effect-blinddown

掩码设置正确,因为如果我手动更改它的位置,它会隐藏并显示其背后的图像,但它没有动画!它只是在动画的最终位置结束,你永远不会看到它真正的盲目。

请帮忙!也许这不是实现盲目效应的最佳方式?

// create a new layer
CALayer *numberLayer = [[CALayer alloc] init];

// render the number "7" on the layer
UIImage *image = [UIImage imageNamed:@"number-7.png"];
numberLayer.contents = (id) [image CGImage];
numberLayer.bounds = CGRectMake(0, 0, image.size.width, image.size.height); // width and height are 50
numberLayer.position = position;

// create a new mask that is 50x50 the size of the image
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRect(path, nil, CGRectMake(0, 0, 50, 50));

[maskLayer setPath:path];
[maskLayer setFillColor:[[UIColor whiteColor] CGColor]];

[theLayer setMask:maskLayer];

[maskLayer setPosition:CGPointMake(0, 0)]; // place the mask over the image

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:3.0];
[maskLayer setPosition:CGPointMake(0, 50)]; // slide mask off the image
// this should shift the blind away in an animation
// but it doesn't animate
[UIView commitAnimations]; 
[maskLayer release];

[boardLayer addSublayer:numberLayer];
[numberLayer release];

1 个答案:

答案 0 :(得分:0)

另一件事要尝试。查看CALayer的{​​{1}}媒体资源。它充当图层上的“视口”。要设置动画,请使用缩小的值启动contentRect,然后将其设置为完整大小。 Core Animation负责为您设置动画。

不确定它是否正是您正在寻找的效果,但有几点需要注意:

  • contentRect位于“单位坐标”中,意味着值的浮点数介于0.0和1.0之间(0.0表示什么都不显示,1.0表示显示所有内容)。

  • 从UIView坐标翻转图层坐标。所以0.0,0.0是左下角,值向上和向右。您必须进行一些调整才能获得正确的效果。

  • 根据百叶窗内的内容,您可能需要设置contentsRect