iOS中的基本拖放功能

Luk*_*uke 93 iphone drag-and-drop touch ipad ios

我希望有一个视图,其中有车辆行驶,用户也可以拖放.您认为这样做的最佳大规模战略是什么?是否最好从代表车辆的视图或更大的视图中获取触摸事件?有没有一个简单的范例,你用来拖放你满意吗?不同策略的缺点是什么?

ohh*_*hho 126

假设你有一个UIView带有背景图像的场景和很多vehicles,你可以将每辆新车定义为UIButton(UIImageView也可能有效):

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageTouch:withEvent:) forControlEvents:UIControlEventTouchDown];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];
Run Code Online (Sandbox Code Playgroud)

然后,您可以通过响应UIControlEventTouchDragInside事件将车辆移动到任何地方,例如:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    CGPoint point = [[[event allTouches] anyObject] locationInView:self.view];
    UIControl *control = sender;
    control.center = point;
}
Run Code Online (Sandbox Code Playgroud)

与管理整个场景相比,单个车辆处理自己的拖车要容易得多.

  • 如果用户拖动按钮的速度比动画更新的速度快,那么此策略是否会导致拖动中断?如果他们的手指在盒子外面,它会停止接收imageMoved:withEvent:calls,对吗? (10认同)
  • 是的,蒂姆,确实如此. (2认同)

Jak*_*lik 34

除了ohho的答案,我尝试过类似的实现,但没有"快速"拖动和居中拖动的问题.

按钮初始化是......

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];
Run Code Online (Sandbox Code Playgroud)

和方法实现:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    UIControl *control = sender;

    UITouch *t = [[event allTouches] anyObject];
    CGPoint pPrev = [t previousLocationInView:control];
    CGPoint p = [t locationInView:control];

    CGPoint center = control.center;
    center.x += p.x - pPrev.x;
    center.y += p.y - pPrev.y;
    control.center = center;
}
Run Code Online (Sandbox Code Playgroud)

我不是说,这是答案的完美解决方案.不过我发现这是最简单的拖动解决方案.

  • 在您的示例代码中,您在使用后定义了UIControl*control = sender - 如果之前没有定义的话? (2认同)