2012-01-21 2 views
2

У меня вопрос о применении нескольких преобразований к UIView. Например, когда я анимацию вращения UIView вокруг ее центральной точки, а затем попытаюсь повернуть ее вокруг точки, которая находится за пределами ее границ, вторая анимация все испортилась, например. он колеблется или вращается совершенно иначе, чем указано. Как я могу сделать это так, чтобы первая анимация не влияла на вторую, но все еще присутствует, когда вторая играется?Последовательное преобразование UIView

EDIT: Вот код. Сначала я повернуть изображение вокруг его центральной точки:

CALayer *layer = view.layer; 

CATransform3D aTransform = CATransform3DIdentity; 
CGFloat zDistance = 2000; 
aTransform.m34 = 1.0/-zDistance; 
scrollView.layer.sublayerTransform = aTransform; 

CGFloat subviewX = 0.5; 
CGFloat subviewY = 0.5; 
[self setAnchorPoint:CGPointMake(subviewX, subviewY) forView:view]; 

CATransform3D bTransform = CATransform3DIdentity; 
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform]; 
bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0); 
rotateAnim.duration=0.05; 
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform]; 
layer.transform = bTransform; 
[layer addAnimation:rotateAnim forKey:nil]; 

Теперь, когда слой поворачивается, я хочу, чтобы перевернуть его вокруг левой границы экрана:

CALayer *layer = view.layer; 

CATransform3D aTransform = CATransform3DIdentity; 
CGFloat zDistance = 2000; 
aTransform.m34 = 1.0/-zDistance; 
tileScrollView.layer.sublayerTransform = aTransform; 

CGFloat subviewX = ((1/view.frame.size.width)*(view.frame.origin.x)); 
CGFloat subviewY = 0.5; 
[self setAnchorPoint:CGPointMake(-subviewX, subviewY) forView:view]; 

CATransform3D bTransform = layer.transform; 
CABasicAnimation *rotateAnim = [CABasicAnimation animationWithKeyPath:@"transform"]; 
rotateAnim.fromValue= [NSValue valueWithCATransform3D:bTransform]; 
bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0); 
rotateAnim.duration=0.2; 
rotateAnim.toValue=[NSValue valueWithCATransform3D:bTransform]; 
layer.transform = bTransform; 
[layer addAnimation:rotateAnim forKey:nil]; 

Поскольку я хочу повернутый слой будет перевернулся, я положил CATransform3D bTransform = layer.transform вместо CATransform3D bTransform = CATransform3DIdentity в начале второй анимации, но опять же, что только беспорядки анимации вверх

Другая, аналогичная проблема у меня есть, что у меня есть UIView, который содержит 9 подвид, один из которых переворачивается d это центральная точка каждую секунду. Но каждый раз, когда я применяю преобразование к супервизуализации этих 9 UIViews, макет субвизоров становится испорченным. Кто-нибудь знает, как предотвратить это? Любая помощь будет принята с благодарностью. Заранее спасибо!

+2

Показать код. –

+0

Существует множество способов анимации просмотров, поэтому, не показывая нам, мы понятия не имеем, что вы делаете. –

ответ

2

Две вещи:

  1. В первом преобразования, вы делаете это:

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 1, 1, 0); 
    

    означает, что вы вращаться вокруг оси, которая составляет 45 ° между х и у оси. Это может быть то, что вы пытаетесь сделать, но это кажется странным. Рассмотрим изменения в

    bTransform = CATransform3DRotate(aTransform,-20*M_PI/180, 0, 1, 0); 
    
  2. На втором этапе, если вы просто хотите, чтобы добавить преобразование на текущее преобразование (то есть повернуть другой 180 °), вы должны изменить эту линию

    bTransform = CATransform3DMakeRotation(-M_PI_2, 0, 1, 0); 
    

    в

    bTransform = CATransform3DRotate(bTransform, -M_PI_2, 0, 1, 0); 
    

    Применяется преобразование к существующему преобразованию вместо игнорирования текущего преобразования.

Смежные вопросы