UILayer пользовательская «компактная» анимация, ищет помощь в привязке - PullRequest
0 голосов
/ 18 мая 2011

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

Проблема в том, что я правильно понял анимацию, согласитесь, я не могу создать "петлевую" часть.То есть шарнир находится в центре, а не сверху.Чего мне не хватает?

Вот код:

   [UIView animateWithDuration:2.0 delay:0.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
                CATransform3D frontTransform = CATransform3DIdentity;
                frontTransform.m34 = 1.0 / -850.0; 
                CATransform3D rotation = CATransform3DRotate(frontTransform, M_PI/2, 1.0, 0.0, 0.0);
                frontTransform = CATransform3DTranslate(frontTransform, 0.0, 0.0, menuView.bounds.size.height);
                frontTransform = CATransform3DConcat(rotation, frontTransform);
                menuView.layer.transform = frontTransform;

            }completion:^(BOOL finished){
                if (finished) {
                    [self.window sendSubviewToBack:menuView];
                    CATransform3D backTransform = CATransform3DIdentity;
                    backTransform.m34 = 0.0f; //Must be first before setting any other properties.
                    backTransform = CATransform3DRotate(backTransform, M_PI, 0.0, 0.0, 0.0);
                    backTransform = CATransform3DTranslate(backTransform, 0.0, 0.0, 0.0);
                    menuView.layer.transform = backTransform;
                }
            }];

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

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 22 мая 2011

Исправлена ​​проблема. Мне нужно было установить как точку привязки слоя, так и свойства позиции.

menuView.layer.position = CGPointMake(menuView.frame.size.width/2, 0.0);
menuView.layer.anchorPoint = CGPointMake(0.5, 0.0);


[UIView animateWithDuration:0.8 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
                menuView.layer.magnificationFilter = kCAFilterNearest;
                menuView.layer.edgeAntialiasingMask = kCALayerBottomEdge;

                CATransform3D backTransform = CATransform3DIdentity;
                backTransform.m34 = 0.0f; 
                backTransform.m43 = 0.0f;
                backTransform = CATransform3DTranslate(backTransform, 0.0, 0.0, 0.0);
                backTransform = CATransform3DRotate(backTransform, M_PI/2, 0.0, 0.0, 0.0);
                menuView.layer.transform = backTransform;                   

            }completion:^(BOOL finished){
                if (finished) {
                    NSLog(@"Position - Show Second: %@", NSStringFromCGPoint(menuView.layer.position));
                    NSLog(@"AnchorP - Show Second: %@", NSStringFromCGPoint(menuView.layer.anchorPoint));
                }
            }];
2 голосов
/ 18 мая 2011

Вы пытались установить точку привязки CALayer к вершине?Здесь в верхней средней точке:

menuView.layer.anchorPoint = CGPointMake(CGRectGetWidth(menuView.bounds)/2, 0.0);
...