ios - 从公共中心一起旋转一组 UIView
问题描述
这是对这个问题的跟进。我有一个类似的设置,有 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;
}
但这并没有按预期工作。任何帮助深表感谢..
解决方案
又是我。这是我进行旋转的方式:
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)
)
}
它与比例非常相似,您获得所有视图的中心,对于每个视图,您获得到该中心的距离,使用公式旋转它以旋转一个点,并将该旋转距离添加到所有视图的中心。
推荐阅读
- sql - 计算不同的出现
- c++ - 位向量和位串有什么区别?
- c# - Sorted Dictionary 和 List<>() 在 VS 2010 中有错误
- javascript - HTML & Javascript - 使用循环创建按钮不会“个性化” .onclick = {}
- php - 如何从另一个模型返回集合?
- c++ - 我正在尝试将我的 c++ 数组从第二个索引切到最后一个索引
- typescript - 如何从 firebase 获取动态属性的值
- android - Android recycler view位置出现index错误
- mongodb - 从 ansible 创建 mongodb 用户时出现 SCRAM-SHA-256 错误
- silverstripe - 如何使用 Silverstripe Fluent 通过 ::get() 访问区域设置字段值