7

我正在学习 iOS,但找不到如何将拖放行为添加到UIView.

我试过:

[_view addTarget:self action:@selector(moved:withEvent:) forControlEvents:UIControlEventTouchDragInside];

UIView它说“声明选择器没有可见界面addTarget (etc)

我也尝试添加一个平移手势识别器,但不确定这是否是我需要的

- (IBAction)test:(id)sender {
       NSLog(@"dfsdfsf");
  }

它被调用,但不知道如何获取事件的坐标。iOS中为移动事件注册回调/进行拖放的标准简单方法是什么?

提前致谢。

4

2 回答 2

15

AUIPanGestureRecognizer绝对是要走的路。如果您希望用户拖动视图,您需要在超级视图的坐标系中“平移”(移动)手势:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:_view.superview];

一旦你有了翻译,你可以通过改变它来移动(“拖动”)视图center

    CGPoint center = _view.center;
    center.x += translation.x;
    center.y += translation.y;
    _view.center = center;

最后,您希望将平移手势识别器的平移设置回零,因此下次收到消息时,它只会告诉您自上一条消息以来手势移动了多少:

    [recognizer setTranslation:CGPointZero inView:_view.superview];
}

在这里,所有这些都可以轻松复制/粘贴:

- (IBAction)panWasRecognized:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:_view.superview];

    CGPoint center = _view.center;
    center.x += translation.x;
    center.y += translation.y;
    _view.center = center;

    [recognizer setTranslation:CGPointZero inView:_view.superview];
}
于 2012-11-12T22:31:09.320 回答
4

touchesBegan从, touchesMoved,开始touchesEnded。在你的 UIView 子类中覆盖这些,你就可以开始学习事件系统了。您可以像这样获取事件坐标:

- (void) touchesBegan:(NSSet *) touches withEvent:(UIEvent *) event
{
    float x = [[touches anyObject] locationInView:self].x;
    float y = [[touches anyObject] locationInView:self].y;
}

然后有很多东西可以在不同视图之间转换坐标等等。一旦你理解了这一点,你就可以使用UIGestureRecognizer你已经找到的那些你需要的东西。

您将需要一个平移手势识别器来进行拖放。您可以使用locationInView:选择器UIPanGestureRecognizer在任何给定时刻找出您所在的位置。

你像这样添加你的手势识别器,而不是你尝试的目标动作:

UIPanGestureRecognizer *dragDropRecog = [[UIPanGestureRecognizer alloc] initWithTarget:yourView action:@selector(thingDragged:)];
[yourView addGestureRecognizer:dragDropRecog];

thingDragged:然后你必须在你的视图中实现选择器:

- (void) thingDragged:(UIPanGestureRecognizer *) gesture
{
    CGPoint location = [gesture locationInView:self];
    if ([gesture state] == UIGestureRecognizerStateBegan) {
        // Drag started
    } else if ([gesture state] == UIGestureRecognizerStateChanged) {
        // Drag moved
    } else if ([gesture state] == UIGestureRecognizerStateEnded) {
        // Drag completed
    }
}

您将翻译被拖动到更改位中的视图,并处理结束部分中的放置。

于 2012-11-12T22:25:49.333 回答