我怎样才能添加大小手柄到UIView?

我想在用户请求运行时dynamic创build视图(UIImageView和UITextView),然后允许用户移动和调整它们的大小。 除了resize之外,我已经做好了一切工作。 我尝试使用捏手势识别器,但发现它太笨拙,我想要的。 所以,我想用大小手柄。 我相信我可以在每个手柄上放置一个平移手势识别器,并调整视图框架,因为它们之一被移动。

在这里输入图像说明

问题是,我不太清楚如何创build大小调整手柄。 我会指出我尝试过的所有事情,但是如实地说,我不太确定从哪里开始。 我有几个想法…

1)可能使用coregraphics在angular落和边上画框或圆圈? 我会创build一个新的图层并在其上绘制它们吗? 不确定。

2)在每个angular落贴一个方块或圆圈的小图像?

3)手柄已经放在它的XIB文件?

任何build议感激。 我只需要指出正确的方向。

编辑:像苹果在页面中使用的东西将是完美的!

在这里输入图像说明

在这里输入图像说明

首先,我build议为UIView创build一个自定义的View子类,你将在这里处理所有的行为。 我们称之为ResizableView。

在自定义视图中,您需要在angular落绘制这些点的图层或视图,然后为其添加PangestureRecognized。然后您可以使用recognizer.locationInView()来跟踪这些点的位置,当用户拖动它们时,您将使用它来计算View.Here是您可以参考的代码:

 func rotateViewPanGesture(recognizer: UIPanGestureRecognizer) { touchLocation = recognizer.locationInView(self.superview) let center = CalculateFunctions.CGRectGetCenter(self.frame) switch recognizer.state { case .Began: initialBounds = self.bounds initialDistance = CalculateFunctions.CGpointGetDistance(center, point2: touchLocation!) case .Changed: //Finding scale between current touchPoint and previous touchPoint let scale = sqrtf(Float(CalculateFunctions.CGpointGetDistance(center, point2: touchLocation!)) / Float(initialDistance!)) let scaleRect = CalculateFunctions.CGRectScale(initialBounds!, wScale: CGFloat(scale), hScale: CGFloat(scale)) self.bounds = scaleRect self.refresh() case:.Ended: self.refresh() default:break 

一步步

Pangesture的touchLocation位置

center是ResizableView的中心

initialBounds是PanGesture开始时ResizableView的初始边界。

initailDistance是用户拖动的点的touchPoint的ResizableView的中心点之间的距离。

然后你可以计算给定initialDistance centercentertouch locationscale

现在你已经按照你的想法缩放了视图。 你也需要相应地刷新这些点的位置,这就是refresh()的作用,你需要自己去实现它。

CalculateFunctions

我倾向于定义一些帮助函数来帮助我计算。

CalculateFunctions.CGPointGetDistance用于计算视图中心与触摸位置之间的距离。

CalculateFunctions.CGRectScale返回给定刚刚计算的比例的缩放CGRect。

CalculateFunctions.CGRectGetCenter返回一个CGRect的中心点

这只是一个粗略的想法。 其实有很多你可以参考的库。 一些build议:

  • SPUserResizableView这是一个ResizableView正是你想要的,但它是用ObjC编写的,并且很久没有更新。 但你可以参考它。
  • JLStickerTextView这可能不适合你的要求,因为它是用于文本(编辑,resize,用一根手指旋转)但是,这是用Swift编写的,这是一个很好的例子。

如果您有任何问题,请随时发布。良好运气:-)

Interesting Posts