如何为UIView添加大小调整手柄?

时间:2016-04-24 05:25:23

标签: ios swift uiview resize handles

我正在尝试通过用户请求在运行时动态创建视图(UIImageView和UITextView),然后允许用户移动和调整它们的大小。除了调整大小外,我的一切都很棒。我尝试使用捏手势识别器,但发现它太笨拙我想要的东西。因此,我想使用尺寸手柄。我相信我可以在每个手柄上放置一个平移手势识别器,并在移动其中一个时调整视图框架。

enter image description here

问题是,我不太确定如何创建大小调整句柄。我会说明我尝试过的所有事情,但说实话,我不太清楚从哪里开始。我确实有一些想法......

1)可能使用核心图形在角落和边上绘制方框或圆圈?我会创建一个新图层并在其上绘制它们吗?不确定。

2)在每个角落贴一个小盒子或圆圈的图像?

3)已放置句柄的XIB文件?

任何建议表示赞赏。我只需指出正确的方向。

编辑:Apple在Pages中使用的东西是完美的!

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:3)

首先,我建议为UIView创建一个自定义View子类,您将在此处理所有行为。我们称之为ResizableView。

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

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

一步一步

touchLocation Pangesture的位置

center是ResizableView的中心

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

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

然后您可以计算scale给定initialDistancecentertouch location

现在您已根据需要缩放视图。你还需要在角落刷新这些点的位置,这是refresh()的内容,你需要自己实现它。

CalculateFunctions

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

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

CalculateFunctions.CGRectScale根据您刚刚计算的比例返回缩放的CGRect。

CalculateFunctions.CGRectGetCenter返回CGRect的中心点

这只是一个粗略的想法。实际上你可以参考很多图书馆。 一些建议:

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

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