Поворот группы UIViews вместе из общего центра - PullRequest
0 голосов
/ 28 августа 2018

Это продолжение вопроса . У меня есть аналогичная установка с n количеством просмотров, и я хочу повернуть их вместе с жестом вращения.

Я знаю, как применить вращение к одному виду, но здесь я хочу повернуть их все из общего центра вместо их собственного.

Итак, я попробовал этот подход

  • Рассчитана общая центральная точка всех выбранных видов
  • Установить перевод вида, указывающий на этот общий центр
  • И повернул представление

Так вот, что я получил

CGPoint newCenter =CGPointZero;
for(UIView *node in self.selectedNodes){
    newCenter = CGPointMake(newCenter.x + node.center.x, newCenter.y + node.center.y);
}

newCenter = CGPointMake(newCenter.x/self.selectedNodes.count, newCenter.y/self.selectedNodes.count);
for(UIview *node in self.selectedNodes){
     CGAffineTransform newTransform = CGAffineTransformMakeTranslation(groupCenter.x,groupCenter.y);
    newTransform = CGAffineTransformRotate( node.transform,recognizer.rotation);
    newTransform = CGAffineTransformTranslate(newTransform,-groupCenter.x, -groupCenter.y);
     node.transform = newTransform;
}

Но это работает не так, как ожидалось. любая помощь высоко ценится.

1 Ответ

0 голосов
/ 28 августа 2018

это снова я. Вот как я сделал ротацию:

let rotation = recognizer.rotation
recognizer.rotation = 0
let center = views.map { $0.center }.reduce(CGPoint.zero, +) / CGFloat(views.count)
views.forEach {
    $0.transform = $0.transform.rotated(by: rotation)
    let distance = $0.center - center
    $0.center = center + CGPoint(
        x: distance.x * cos(rotation) - distance.y * sin(rotation),
        y: distance.y * cos(rotation) + distance.x * sin(rotation)
    )
}

Это очень похоже на масштаб: вы получаете центр всех видов, для каждого вида вы получаете расстояние до этого центра, поворачиваете его по формуле для поворота точки и добавляете это повернутое расстояние к центру всех видов. .

...