1

私はIOSの初心者です。よく検索しましたが、IOS でのドラッグ アンド ドロップに関する適切なチュートリアルは見つかりませんでした。直接サポートされていないことを読んだだけです。アイテムをスクロール ビューからビューにドラッグして、いくつかの情報を渡すことは可能ですか? メールアプリを想像してみてください。右側の大きなビューにメールをドラッグして、いくつかの情報を渡したいと思います。作り方を教えてくれる本やチュートリアルはありますか?

TKS!

4

1 に答える 1

4

Gesture Recognizer を使用するだけです (イベント ハンドラー ガイドを参照)。

実際の実装は、どのようにしたいかによって少し異なります。これは、分割ビュー コントロールがあり、左側のテーブルビューから右側のビューに何かをドラッグしているランダムな例です。ドラッグ アンド ドロップ全体が長押し (たとえば、「タップ アンド ホールド」) によってトリガーされます。 )。したがって、tableview コントローラー (私の場合はマスター ビュー コントローラー) の viewDidLoad にジェスチャ認識エンジンを作成するだけです。

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];
    }
}

明らかに、スクロールビューからサブビューをドラッグする場合、indexPathForRowAtPointロジックを次のようなものに置き換えます。

    UIView *objectToDrag = nil;
    CGPoint point = [sender locationInView:myView];
    for (UIView *control in myView.subviews)
        if (CGRectContainsPoint(control.frame, point))
            objectToDrag = control;

    if (!objectToDrag)
    {
        inDrag = NO;
        return;
    }

これは、ドラッグしたいものを特定するのに役立ちますが、そこからのロジックは非常に似ています (ただし、私の例のように UILabel をドラッグするのではなく、objectToDrag をドラッグします)。

于 2012-05-14T14:20:45.050 に答える