从公共中心一起旋转一组UIView

时间:2018-08-28 07:20:09

标签: ios objective-c uiview rotation transform

这是对此question的后续行动。我有一个类似的设置,具有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 :(得分:1)

又是我。这是我的轮换方式:

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

它与比例尺非常相似,您将获得所有视图的中心,对于每个视图,您将获得到该中心的距离,使用公式旋转它以旋转一个点,然后将旋转后的距离添加到所有视图的中心