在我的应用程序中,我有一个代表粉笔的 UIImageView。用户可以拿起它并将其拖到屏幕上以使用它进行绘图。
我使用 touchesBegan、touchesMoved 和 touchesEnded 实现了这一点。在 touchesMoved 中,我将 UIImageView 的中心 move 到当前触摸位置,并用核心图形从上一个位置到当前位置绘制一条线。
这很好用,但 ImageView move 不是很流畅,而且还滞后于触摸。我已经尝试使用 UIPanGestureRecognizer(没有识别手势)和我放置粉笔的 UIScrollView(没有真正弄清楚如何配置它以便它可以在各个方向上 move 得足够远)。
你能给我一些提示,如何提高我的粉笔运动的质量吗?
谢谢!
最佳答案
下面的 tapGesture 方法对我来说很顺利:
- (void)handlePan:(UIPanGestureRecognizer*)gesture{
View* view = (View*)gesture.view;
if (gesture.state == UIGestureRecognizerStateEnded){
view.dragStartingPoint = CGPointZero;
return;
}
CGPoint point = [gesture locationInView:gesture.view];
if (gesture.state == UIGestureRecognizerStateBegan){
view.dragStartingPoint = point;
view.dragStartingFrame = view.frame;
return;
}
if (CGPointEqualToPoint(view.dragStartingPoint, CGPointZero))
return;
CGFloat x = view.dragVerticallyOnly? view.frame.origin.x: view.dragStartingFrame.origin.x + point.x - view.dragStartingPoint.x;
CGFloat y = view.dragHorizontallyOnly? view.frame.origin.y: view.dragStartingFrame.origin.y + point.y - view.dragStartingPoint.y;
if (self.dragVerticallyOnly == NO){
if (x < view.dragMinPoint.x){
x = view.dragMinPoint.x;
}
else if (x > self.dragMaxPoint.x){
x = view.dragMaxPoint.x;
}
}
if (self.dragHorizontallyOnly == NO){
if (y < view.dragMinPoint.y){
y = view.dragMinPoint.y;
}
else if (y > self.dragMinPoint.y){
y = view.dragMinPoint.y;
}
}
CGFloat deltaX = x - view.frame.origin.x;
CGFloat deltaY = y - view.frame.origin.y;
if ((fabs(deltaX) <= 1.0 && fabs(deltaY) <= 1.0))
return; // Ignore very small movements
[UIView animateWithDuration:0.1 animations:^{
view.frame = CGRectMake(x, y, view.frame.size.width, view.frame.size.height);
}];
最重要的几点是:
- 使用动画选项制作 Action ; (十分之一秒似乎可以很好地完成工作)。
- 避免不必要的 Action 。进行一些计算不会使其变慢,但进行不必要的 move 可能会变慢。但是,您无法避免许多 Action ,否则它不会跟随用户的平移手势。
根据您希望 View 的行为方式,您可能需要进行更多优化。
备注:我的方法还考虑了您可以定义的边界和 move 方向限制,以备不时之需。例如,在我的例子中,我添加了速度限制。如果用户超过某个平移速度,我将忽略进一步的平移手势并以该速度 move 用户指向的 View (动画)。在相同的情况下,它可能有意义也可能没有意义。在我的,它做到了!
希望对您有所帮助!
关于ios - 如何在 iOS 上用用户手指平滑 move UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925441/