Как повернуть слой в определенной точке привязки без пропуска? - PullRequest
11 голосов
/ 10 марта 2012

Я хочу повернуть слой с изображением в левом верхнем углу, а не в центре.В соответствии с документами я установил для свойства anchorPoint значение [0, 1].В моем примере вид поворачивается на 50 °, но перед тем, как начать анимацию, вид переходит к другой точке экрана.

self.shakeTag.layer.anchorPoint = CGPointMake(0.0f, 1.0f);
[UIView beginAnimations:@"rotate" context:nil];
[self.shakeTag.layer setTransform:
  CATransform3DRotate(CATransform3DIdentity,
  radians(50.0), 0.0f, 0.0f, 1.0f)];
[UIView commitAnimations];

radians() определяется следующим образом:

static inline double radians (double degrees) {return degrees * M_PI/180;}

Когда я использую изображение, которое в 4 раза больше размера и имеет много прозрачных пикселей, я могу повернуть его в точке привязки по умолчанию [0.5, 0.5], но я не хочу тратить пространство на невидимые пиксели,Любые идеи, как я могу предотвратить скачок слоя до вращения?

1 Ответ

23 голосов
/ 10 марта 2012

Изменение точки привязки влияет на позиционирование вашего зрения. Вам нужно будет изменить положение вида, если вы измените опорную точку и хотите сохранить вид там, где он сейчас находится. Используйте что-то вроде этого (взято отсюда: Скачки положения слоя в начале анимации (Core) ), чтобы установить точку привязки и компенсировать изменения положения:

-(void)setAnchorPoint:(CGPoint)anchorPoint forView:(UIView *)view
{
    CGPoint newPoint = CGPointMake(view.bounds.size.width * anchorPoint.x, view.bounds.size.height * anchorPoint.y);
    CGPoint oldPoint = CGPointMake(view.bounds.size.width * view.layer.anchorPoint.x, view.bounds.size.height * view.layer.anchorPoint.y);

    newPoint = CGPointApplyAffineTransform(newPoint, view.transform);
    oldPoint = CGPointApplyAffineTransform(oldPoint, view.transform);

    CGPoint position = view.layer.position;

    position.x -= oldPoint.x;
    position.x += newPoint.x;

    position.y -= oldPoint.y;
    position.y += newPoint.y;

    view.layer.position = position;
    view.layer.anchorPoint = anchorPoint;
}

Также см. Здесь для получения более подробной информации: Изменение anchorPoint моего CALayer перемещает представление

...