Масштабирование анимации в фоновом режиме из другого anchorPoint

Я сделал анимацию масштабирования для фонового изображения со стрелкой в ​​нем, хорошо масштабируя изображение (оно включает в себя стрелку), означающее весь фон. он масштабируется от центра фона. но я хочу начать масштабирование от центра стрелки.

я хочу добиться этого:

Тогда стать со шкалой:

Что я должен изменить в своем коде:

    self.blueBackground.transform = CGAffineTransformScale(CGAffineTransformIdentity, 1, 1);
    [UIView animateWithDuration:5 animations:^{
        self.blueBackground.transform = CGAffineTransformScale(CGAffineTransformIdentity, 30, 30);

    } completion:^(BOOL finished) {

    }];

С моим текущим кодом шкала начинается с центра фона, поэтому стрелка заканчивается справа (за пределами экрана).

1 ответ

Решение

Попробуйте что-то вроде этого:

- (void)animateArrow
{
  self.blueBackground.transform = CGAffineTransformIdentity;
  [UIView animateWithDuration:5 animations:^{
    ScaleViewAboutPointInBounds(self.blueBackground, arrowCenter, 30);
  } completion:^(BOOL finished) {
  }];
}

static void ScaleViewAboutPointInBounds(UIView *view, CGPoint point, CGFloat scaleAmount)
{
  CGFloat xAnchor = view.layer.anchorPoint.x * CGRectGetWidth(view.bounds);
  CGFloat yAnchor = view.layer.anchorPoint.y * CGRectGetHeight(view.bounds);

  CGFloat xOffset = point.x - xAnchor;
  CGFloat yOffset = point.y - yAnchor;

  CGAffineTransform shift = CGAffineTransformMakeTranslation(-xOffset, -yOffset);
  CGAffineTransform unshift = CGAffineTransformMakeTranslation(xOffset, yOffset);
  CGAffineTransform scale = CGAffineTransformMakeScale(scaleAmount, scaleAmount);

  view.transform = CGAffineTransformConcat(shift, CGAffineTransformConcat(scale, unshift));
}

Это, вероятно, более общее, чем вам нужно, и вы могли бы сделать это проще, но это тоже должно сработать. Просто измените point к чему-то, что выглядит как центр стрелки.

Другие вопросы по тегам