我正在尝试根据用户请求在运行时动态创建 View (UIImageView 和 UITextView),然后允许用户移动它们并调整它们的大小。除了调整大小,我的一切都很好。我尝试使用捏合手势识别器,但发现它对于我想要的东西来说太笨拙了。因此,我想使用大小调整 handle 。我相信我可以在每个 handle 上放置一个平移手势识别器,并在其中一个 handle 移动时调整 View 框架。
问题是,我不太确定如何创建大小调整 handle 。我会指出我尝试过的所有事情,但说实话,我不太确定从哪里开始。我确实有一些想法......
1) 可能使用 coregraphics 在角和边上绘制框或圆圈?我会创建一个新层并在上面绘制它们吗?不确定。
2) 在每个角上贴一个方框或圆圈的小图片?
3) XIB 文件已经放置了句柄?
任何建议表示赞赏。我只需要指出正确的方向。
编辑:像 Apple 在 Pages 中使用的东西将是完美的!
最佳答案
首先,我建议为 UIView 创建一个自定义 View 子类,您将在这里处理所有行为。我们称它为 ResizableView。
在自定义 View 中,您需要为这些角点绘制图层或 View ,并为其添加 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 中心之间的距离。
然后你可以计算给定initialDistance
、center
、touch location
的scale
现在您已经根据需要缩放了 View 。你还需要相应地刷新这些角点的位置,这就是refresh()
的作用,你需要自己实现。
计算函数
我倾向于定义一些 helpFunctions 来帮助我计算。
CalculateFunctions.CGPointGetDistance
用于计算 View 中心和触摸位置之间的距离。
CalculateFunctions.CGRectScale
根据您刚刚计算的比例返回缩放后的 CGRect。
CalculateFunctions.CGRectGetCenter
返回 CGRect 的中心点
这只是一个粗略的想法。其实有很多库可以引用。 一些建议:
- SPUserResizableView 这正是您想要的 ResizableView,但它是用 ObjC 编写的,并且已经很长时间没有更新了。但你可以引用它。
- JLStickerTextView这可能不太适合您的要求,因为它适用于文本(编辑、调整大小、用一根手指旋转)但是,这个是用 Swift 编写的,对您来说是一个很好的例子。
如果您有任何问题,请随时发布。祝您好运:-)
关于ios - 如何向 UIView 添加大小调整 handle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36819603/