如何通过从边缘拖动来调整 UIView 的大小?
在我的 iPad 应用程序中,我希望用户能够通过从边缘拖动视图来调整 UIView
的大小。我将使用 iOS 5 SDK,那么最简洁的方法是什么?有没有其他方法可以在不处理touchesBegan、touchesMoved等的情况下实现这一目标?
In my iPad app, I want the users to be able to resize a UIView
by dragging the view from its edges. I'll be using iOS 5 SDK, so what's the cleanest approach to do this? Are there any alternatives to achieving this without dealing with touchesBegan, touchesMoved,... etc?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我猜测您的 UI 涉及视图两侧的某种手柄,并且将简单的
UIPanGestureRecognizer
附加到这些手柄控件使整个问题变得非常简单。在手势识别器的操作方法中,只需获取相对于要调整大小的视图的
-translationInView:
,当手势识别器的状态为UIGestureRecognizerStateBegan
时,保存原始帧,并在状态为 UIGestureRecognizerStateChanged 时不断调整视图的框架。I'm guessing your UI involves some kind of handles on the sides of the view, and attaching a simple
UIPanGestureRecognizer
to those handle controls makes the whole problem pretty easy.In the action method from the gesture recognizer, just get the
-translationInView:
relative to the view you're resizing, save off the original frame when the gesture recognizer's state isUIGestureRecognizerStateBegan
, and adjust the view's frame continually while the state isUIGestureRecognizerStateChanged
.这是一个 Swift 4.2 解决方案,可与 AutoLayout 和 AutoLayout 配合使用。约束动画。
由于建议在使用 AutoLayout 时对约束进行动画处理,而不是对矩形的实际大小进行动画处理,因此该解决方案正是这样做的。
附加功能:
在这里查看它的视频:
https://i.sstatic.net/hlAUn.jpg
导入是将约束连接为outlet ,为它们设置动画。
我也将其作为 Github 上的工作项目:
https://github.com/ppoh71/resizeRectangleOnTouchDrag
This is a Swift 4.2 Solution which works with AutoLayout & Constraint-Animation.
Since it is recommended to animate the constraints rather than the actual size of a rectangle when working with AutoLayout, this solutions does exactly that.
Additional features:
Checkout a video of it here:
https://i.sstatic.net/hlAUn.jpg
Import is to connect the constraints as outlets, to animate them.
I put this as working project on Github too:
https://github.com/ppoh71/resizeRectangleOnTouchDrag
@Prerna Chavan 解决方案的 Swift 版本,Prerna 解决方案不会检测用户是否触摸边缘,它仅检测角点,但是下面的代码会检测所有角点
Swift Version of @Prerna Chavan solution , Prerna solution does not detect if user touch on edges, it is detecting only corners, however below code detects all
只是我在 @Peter Pohlmann 答案中添加的一个
小固定
,它不允许将视图拖动或移动到视图框架之外
位位于
override func TouchesMoved(_ Touches: Set, with event: UIEvent?)
Just a
small fixed
added by me to @Peter Pohlmann answer, that doesn't allow dragging or moving the view outside theview's frame
The only bit is in
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
您可以通过检查触摸起点来完成此操作。如果它击中了四个角之一,您可以根据触摸起始点和当前触摸点之间的距离调整大小。 (如果触摸起点没有碰到角点,我们只需移动视图而不是调整大小。)
定义可拖动角点的大小。
将这些实例变量添加到您的类中以跟踪触摸状态以及我们调整大小的方式。
处理触摸启动/更改事件。
You can do this by checking the touch-start point. If it hits one of your four corners you can resize based on the distance between that touch-start point and the current-touch point. (If the touch-start point didn't hit a corner, we just move the view instead of resizing.)
Define the size of your draggable corners.
Add these instance variables to your class to keep track of touch state and which way we're resizing.
Handle the touch start / change events.
我使用
enum
更新了上面的代码。currentEdge
保存用户触摸位置的状态。I updated above code using
enum
.currentEdge
saves state of touch position of user.