UIViews的缩放组,但保持其位置

我试图用捏合手势(在基本视图上)一次缩放多个UIViews。 虽然它看起来很直接,但我很难让它正常工作。

假设我有3个像这样堆叠的视图

---------------------------------------------- | | | ------- -------- | | | | | | | | | V1 | --------------- | | | | | | X | v2 | Y | v3 | | | ------- --------------- | | | | -------- | --------------------------------------------- 

在紧要关头,我通过使用scale propery计算变换来缩放3个视图中的每一个

 CGAffineTransform v1Transform = CGAffineTransformScale( v1.transform,recognizer.scale, recognizer.scale); v1.transform = v1Transform CGAffineTransform v2Transform = CGAffineTransformScale( v2.transform,recognizer.scale, recognizer.scale); v2.transform = v2Transform CGAffineTransform v3Transform = CGAffineTransformScale( v3.transform,recognizer.scale, recognizer.scale); v3.transform = v3Transform 

并使用当前比例更改每个视图的中心,如下所示

  CGPoint v1Center = CGPointMake(v1.center.x * recognizer.scale, node.imgView.center.y * recognizer.scale); CGPoint v2Center = CGPointMake(v2.center.x * recognizer.scale, node.imgView.center.y * recognizer.scale); CGPoint v3Center = CGPointMake(v3.center.x * recognizer.scale, node.imgView.center.y * recognizer.scale); v1.cente = v1Center; v2.center = v2Center; v3.center = v3Center; 

虽然这样可以均匀地对3个视图中的每一个进行缩放,但我觉得中心点太过分了,缩放看起来更怪异。 请检查下面的屏幕截图

在此处输入图像描述

正如您所看到的,虽然比例按预期工作,但所有3个视图都可以缩放。 中心仍然是一个问题。 我希望从所有3个视图的实际位置完成比例,我不希望它们在gif中像这样移动。

有办法吗? 任何帮助深表感谢

如果我理解正确,那么在缩放一组元素时,您需要通常的行为,这是为了使它们从所有选定元素的中心缩放。

我之前已经完成了这个,它在Swift中并使用了我创建的一个名为CGMath *的库的扩展,但它应该足够好作为伪代码:

 let scale = recognizer.scale // Reset the scale of the recognizer. We'll scale the views by the change in the last tick. recognizer.scale = 1 // Get the center of all selected views as a CGPoint let center = views.map { $0.center }.reduce(CGPoint.zero, +) / CGFloat(views.count) views.forEach { // Scale the view $0.scale *= scale // Get the distance from this view to the center of all views, this is a CGPoint let distance = $0.center - center // Multiply the distance by the scale and add it to the center of all views. Set that as the view's center. $0.center = center + (distance * scale) } 

* CGMath中的扩展使得可以添加和减少点数。

发生的事情是你也在缩放视图的x和y位置,相对于0,0这是屏幕的一角。 你需要相对于屏幕的中心或者你的捏手势的中心来做。 我不记得我的头脑,但我认为有一种方法来指定刻度的锚点,如果不是,你将不得不手动计算位置调整。

@EmilioPelaez答案按预期工作。 这是他的伪代码的obj-c版本,任何人都感兴趣

 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 = CGAffineTransformScale( node.transform,recognizer.scale, recognizer.scale); node.transform = newTransform; CGPoint distance = CGPointMake(node.center.x - newCenter.x, node.center.y - newCenter.y); CGPoint delta= CGPointMake(distance.x * recognizer.scale, distance.y * recognizer.scale); node.center =CGPointMake(newCenter.x + delta.x, newCenter.y + delta.y); }