在我的应用程序中,我有一个代表粉笔的UIImageView。用户可以将其选中并将其拖动到屏幕上以进行绘制。
我使用touchesBegan,touchesMoved和touchesEnded实现了它。在touchesMoved中,我将UIImageView的中心移动到当前触摸位置,并从最后一个位置绘制一条核心图形到当前位置。
效果很好,但图像视图移动不是很平滑,而且还落后于触摸。我已经尝试使用UIPanGestureRecognizer(不识别手势)和UIScrollView,我在其中放置了粉笔(没有真正弄清楚如何配置它以便它可以在所有方向上移动得足够远)。
你能给我一些提示,如何改善粉笔运动的质量吗?
谢谢!
答案 0 :(得分:1)
以下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);
}];
}
最重要的一点是:
根据您希望视图的行为方式,您可能需要进行更多优化。
备注:我的方法还考虑了您可能在需要时定义的边界和移动方向限制。例如,在我的情况下,我添加了速度限制。如果用户超出某个平移速度,我只是忽略进一步的平移手势并移动用户指向的视图(动画),并以该速度移动。在相同的情况下,它可能有意义或无意义。在我的,它做到了!
我希望我得到了一些帮助!
答案 1 :(得分:0)
尝试减小正在使用的粉笔图像的大小....
已编辑:
按尺寸,我指的是图像文件大小。
当我遇到类似问题时,它帮助了我。
答案 2 :(得分:0)
看看这个组件:spuserresizableview http://cocoacontrols.com/platforms/ios/controls/spuserresizableview
源代码非常简单,可以帮助您理解视图处理。
答案 3 :(得分:-2)
我重写了如何计算运动,现在它变得更平滑了。不完美,但这已经足够了。