我正在尝试通过用户请求在运行时动态创建视图(UIImageView和UITextView),然后允许用户移动和调整它们的大小。除了调整大小外,我的一切都很棒。我尝试使用捏手势识别器,但发现它太笨拙我想要的东西。因此,我想使用尺寸手柄。我相信我可以在每个手柄上放置一个平移手势识别器,并在移动其中一个时调整视图框架。
问题是,我不太确定如何创建大小调整句柄。我会说明我尝试过的所有事情,但说实话,我不太清楚从哪里开始。我确实有一些想法......
1)可能使用核心图形在角落和边上绘制方框或圆圈?我会创建一个新图层并在其上绘制它们吗?不确定。
2)在每个角落贴一个小盒子或圆圈的图像?
3)已放置句柄的XIB文件?
任何建议表示赞赏。我只需指出正确的方向。
编辑:Apple在Pages中使用的东西是完美的!
答案 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
给定initialDistance
,center
,touch location
现在您已根据需要缩放视图。你还需要在角落刷新这些点的位置,这是refresh()
的内容,你需要自己实现它。
我倾向于定义一些helpFunction来帮助我计算。
CalculateFunctions.CGPointGetDistance
用于计算视图中心与触摸位置之间的距离。
CalculateFunctions.CGRectScale
根据您刚刚计算的比例返回缩放的CGRect。
CalculateFunctions.CGRectGetCenter
返回CGRect的中心点
这只是一个粗略的想法。实际上你可以参考很多图书馆。 一些建议:
如果您有任何疑问,请随时发布。好运: - )