Слепая анимация на CALayer с использованием маски - PullRequest
3 голосов
/ 05 марта 2010

Я хочу создать эффект «слепого поворота» на изображении, чтобы изображение «ослепило» и появилось.

Вроде как этот переход 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 голосов
/ 08 мая 2010

Еще одна вещь, чтобы попробовать.Проверьте CALayer 's contentRect собственность.Он действует как «область просмотра» над слоем.Чтобы оживить его, начните contentRect с уменьшенного значения, затем установите его в полный размер.Core Animation позаботится о том, чтобы анимировать его для вас.

Не уверен, что это именно тот эффект, который вы ищете, но есть несколько вещей, о которых следует помнить:

  • contentsRect находится в «единичных координатах», что означает значения с плавающей запятой в диапазоне от 0,0 до 1,0 (0,0 означает «ничего не показывать», а 1,0 означает «показать все»).

  • Координаты слоя отображаютсяUIView координаты.Таким образом, 0.0, 0.0 - это левый нижний угол, а значения идут вверх и вправо.Вам нужно будет внести некоторые коррективы, чтобы получить правильный эффект.

  • В зависимости от того, что находится внутри блайндов, вам может потребоваться установить masksToBounds=YES.

...