拖动;视图控制器之间的丢弃(包含在同一视图控制器中)

时间:2012-06-28 12:49:37

标签: objective-c ios ios5 uiviewcontroller uigesturerecognizer

我有一个视图控制器,它显示在拆分视图的详细视图中,它由 TableView 核心图表视图组成,如下所示:

My view controller

我希望能够拖延将单个TableViewCells删除到Core Plot视图。

最好的方法是什么,因为手势识别器只能绑定到一个视图?

如何制作阻力和动画的动画?放下移动?

关于视图控制器包含的其他问题

如果两个视图控制器都包含在同一个视图控制器容器中(如iOS 5中所示),我如何实现从一个视图控制器拖放到另一个视图控制器。

谢谢!

2 个答案:

答案 0 :(得分:4)

以下是一些代码,用于将分割视图左侧面板上的表格视图中的行拖动到右侧面板详细信息屏幕。这看起来与您的问题类似,但不尽相同。无论如何,我个人从长时间的印刷中触发拖拽:

UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self.tableView addGestureRecognizer:longPress];

然后我的处理程序执行以下操作:

- (IBAction)longPress:(UIGestureRecognizer *)sender
{
    if (sender.state == UIGestureRecognizerStateBegan)
    {        
        // figure out which item in the table was selected

        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[sender locationInView:self.tableView]];
        if (!indexPath)
        {
            _inDrag = NO;
            return;
        }

        _inDrag = YES;

        // get the text of the item to be dragged

        NSString *text = [NSString stringWithString:[[_objects objectAtIndex:indexPath.row] description]];

        // create item to be dragged, in this example, just a simple UILabel

        UIView *splitView = self.splitViewController.view;
        CGPoint point = [sender locationInView:splitView];
        UIFont *font = [UIFont systemFontOfSize:12];
        CGSize size = [text sizeWithFont:font];
        CGRect frame = CGRectMake(point.x - (size.width / 2.0), point.y - (size.height / 2.0), size.width, size.height);
        _draggedView = [[UILabel alloc] initWithFrame:frame];
        [_draggedView setFont:font];
        [_draggedView setText:text];
        [_draggedView setBackgroundColor:[UIColor clearColor]];

        // now add the item to the view

        [splitView addSubview:_draggedView];
    }
    else if (sender.state == UIGestureRecognizerStateChanged && _inDrag) 
    {
        // we dragged it, so let's update the coordinates of the dragged view

        UIView *splitView = self.splitViewController.view;
        CGPoint point = [sender locationInView:splitView];
        _draggedView.center = point;
    }
    else if (sender.state == UIGestureRecognizerStateEnded && _inDrag)
    {
        // we dropped, so remove it from the view

        [_draggedView removeFromSuperview];

        // and let's figure out where we dropped it

        UIView *detailView = self.detailViewController.view;
        CGPoint point = [sender locationInView:detailView];

        UIAlertView *alert;
        if (CGRectContainsPoint(detailView.bounds, point))
            alert = [[UIAlertView alloc] initWithTitle:@"dropped in details view" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        else
            alert = [[UIAlertView alloc] initWithTitle:@"dropped outside details view" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil];
        [alert show];
    }
}

答案 1 :(得分:0)

您可以创建一个与tableView Cell相同的空视图。选择行时,将单元格数据设置为该空视图,并在tableview上添加该空视图。

现在您可以使用手势识别器拖动空视图,一旦释放超出tableviews框架,则根据该值和&amp ;;绘制图形。从当前视图中删除该视图。

此处只有问题是您必须先选择要执行拖放操作的行。从第二次起,您将使用拖放功能。

这是我在我的应用程序中实现的内容。希望这可以帮助。