Последовательное преобразование UIView - PullRequest
2 голосов
/ 21 января 2012

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

РЕДАКТИРОВАТЬ: Вот код. Сначала я поворачиваю вид вокруг его центральной точки:

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 подвидов, один из которых переворачивает свою центральную точку каждую секунду. Но каждый раз, когда я применяю преобразование к superView этих 9 UIViews, компоновка subViews портится. Кто-нибудь знает, как это предотвратить? Любая помощь будет принята с благодарностью. Заранее спасибо!

1 Ответ

2 голосов
/ 21 января 2012

Две вещи:

  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);
    

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

...