проблемы видимости (перекрытия) с преобразованиями CABasicAnimation CALayer - PullRequest
1 голос
/ 26 февраля 2010

У меня есть два UIImageViews на моем объекте, и я пытаюсь анимировать их на странице, как книгу. Некоторое время я использовал некоторые из встроенных анимаций (UIViewAnimationTransitionFlipFromLeft/Right) и решил, что смогу работать лучше. Я нашел хороший пример для половины анимации, которую я хотел здесь: http://fiftysixtysoftware.com/blog/2009/uiview-pageopen-sample-project/

Я смог оттуда экстраполировать, чтобы заставить мою анимацию работать ... но проблема, с которой я столкнулся, заключается в том, что мое анимационное изображение (правое изображение) всегда отображается ниже левого изображения. 1007 *

Вот код в инициализации:

// set up some rects for use later
landscapeLeftRect = CGRectMake(0, 12, 512, 725);
landscapeRightRect = CGRectMake(512, 12, 512, 725);

// all our images
imageLeft = [[UIImageView alloc] initWithFrame:portraitRect];
imageRight = [[UIImageView alloc] initWithFrame:landscapeRightRect];

... и выполнение реальной анимации (обратите внимание, что это вторая половина анимации, половина, которая «перекрывается» с моим представлением imageLeft):

// set the image to be nextLeft
//[imageRight setImage:image.nextLeft];
[self.view sendSubviewToBack:imageLeft];
[self.view bringSubviewToFront:imageRight];
//[imageRight.layer setZPosition:1.0f];
[imageRight setFrame:landscapeLeftRect];

// remove any previous animations
[imageRight.layer removeAllAnimations];

// set up the anchorPoint and center
if (imageRight.layer.anchorPoint.x != 1.0f) {
    imageRight.layer.anchorPoint = CGPointMake(1.0f, 0.5f);
    imageRight.center = CGPointMake(imageRight.center.x + imageRight.bounds.size.width/2.0f, imageRight.center.y);
}

// create an animation to hold the first half of the page turning forward
CABasicAnimation *transformAnimation = [CABasicAnimation animationWithKeyPath:@"transform"];
transformAnimation.removedOnCompletion = YES;
transformAnimation.duration = 0.40f;
transformAnimation.delegate = self;
transformAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
// start the animation from the current state
CATransform3D endTransform = CATransform3DMakeRotation(3.141f/2.0f,
                                                       0.0f,
                                                       -1.0f,
                                                       0.0f);
// these values control the 3D projection outlook
endTransform.m34 = -0.001f;
endTransform.m14 = 0.0015f;
transformAnimation.fromValue = [NSValue valueWithCATransform3D:endTransform];
// we should end up at the beginning...
transformAnimation.toValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];

[imageRight.layer addAnimation:transformAnimation forKey:nil];

Вещи, которые я пробовал: (вы можете увидеть оба кода выше)

  • bringSubviewToFront / sendSubviewToBack
  • установка индекса Z для слоя

Заранее спасибо за любой совет или мудрость. Опять же, проблема в том, что мой imageLeft всегда отображается поверх анимации.

Ответы [ 4 ]

3 голосов
/ 21 ноября 2010

Я столкнулся с той же проблемой и обнаружил, что ее можно исправить, установив zPosition вида. Я использовал что-то вроде этого:

viewThatShouldBeSentToTheBack.layer.zPosition = -10000;

0 голосов
/ 29 апреля 2011

Я столкнулся с этой точной проблемой и нашел единственный способ избежать ее, установив zPosition для своего фона на большое отрицательное число. Было бы неплохо точно знать, почему ...

0 голосов
/ 23 апреля 2010

Вы уверены, что правильно перебираете массив при добавлении просмотра страницы в суперпредставление? Естественно, вы хотели бы поместить последнюю страницу первой, чтобы ваша первая страница была сверху ... Я не оскорбляю ваш интеллект - слои могут быть сложными.

0 голосов
/ 20 апреля 2010

Я обнаружил, что как только я перенес анимированный вид на передний план, все заработало. Я работаю над анимацией переворачивания страницы, и у меня возникли проблемы при переходе назад, показывая наложение страницы против часовой стрелки. Моя проблема была в том, что я просто не мог видеть анимацию, так как она находилась за страницей, которую она должна была наложить.

...