6

セルを別のセルにドラッグできるようにしたいと思います。離すと、セルが効果的に「マージ」されます (別のセルが表示されます)。UITableViewが最適なコントロールなのかUICollectionView. 進め方について何か考えがある人はいますか?

4

3 に答える 3

4

適切に取得できなかった可能性がありますが、取得したように、ドラッグしてセルをマージしたいので、いくつかのコードを実装してください。これを見てください。

このようなものが欲しいなら...

スクリーンショット

そのような編集コードを使用してください:---

ViewDidLoad で配列を初期化し、テーブルを次のように編集モードに設定します。

fruitsArray=[[NSMutableArray alloc] initWithObjects:@"Apple",@"Banana",@"Mango",@"Guava",@"PineApple",@"Watermelon",@"Grapes",@"GroundNut",@"Muskmelon",@"Orange",@"Cherry",nil];
[tblView setEditing:YES];

tableView のデータソースを次のように設定:->

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
    return UITableViewCellEditingStyleNone;
}

- (BOOL)tableView:(UITableView *)tableview shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath {
    return NO;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    if (sourceIndexPath.row!=destinationIndexPath.row) {
        NSString *sourceString=[fruitsArray objectAtIndex:sourceIndexPath.row];
        NSString *destinationString=[fruitsArray objectAtIndex:destinationIndexPath.row];

        destinationString=[destinationString stringByAppendingFormat:@",%@",sourceString];

        [fruitsArray replaceObjectAtIndex:destinationIndexPath.row withObject:destinationString];
        [fruitsArray removeObjectAtIndex:sourceIndexPath.row];

        [tblView reloadData];
    }
}

このサンプルコードを試してください

于 2013-07-22T13:57:56.903 に答える
2

これは、疑似コードで開発するために使用したソリューションです。

  1. UILongPressGestureRecognizerをUITableViewに追加します
  2. UIGestureRecognizerStateBegan、 を使用して、[UITableView indexPathForRowAtPoint]どのセルが「長押し」されているかを判断します。このセルをhover UITableViewCellに変えます。
  3. 参照変数を対応するモデル オブジェクトに設定します。
  4. を使用しUIGraphicsBeginImageContextWithOptionsて、実際の UITableViewCell コンテンツのイメージをレンダリングします。を作成し、UIImageViewカスタム クロームを追加します (シャドウなど)。
  5. カスタム UIImageView をサブビューとして UITableView に追加し、元の選択された固定された UITableViewCell を削除します (removeFromSuperview)。
  6. で、ホバーのUIGestureRecognizerStateChanged位置を計算し、固定されたセルをアニメーション化します。 (以前に強調表示されたピン留めされたセルのアニメーションを切り替えることもできます)。UITableViewCellUITableView
  7. ユーザーが LongPress を離したら、モデル配列の順序を変更し、基になるピン留めさUITableViewれたセルを削除してから、呼び出しですべてをリロードしbeginUpdatesます。

境界条件にヒットしたときのスクロール、ホバーセルを元の場所にドロップするなど、他にも注意すべき点がいくつかありますが、それが基本的な要点です。うまくいけば、それは役に立ちます。

于 2013-07-25T02:58:24.460 に答える
1

これには長押しジェスチャーを使用しました。ここにサンプルコードがあります

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    {

    UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:cell action:nil];
                longPress.delegate = self;
                [cell addGestureRecognizer:longPress];

    }

    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
        if([gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]){
            [gestureRecognizer addTarget:self action:@selector(moveRight:)];
        }
        return YES;

        if([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]){
            [gestureRecognizer addTarget:self action:@selector(tapAction:)];
        }
        return YES;
    }

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }


- (void)moveRight:(UILongPressGestureRecognizer *)sender {

   /*if (sender.view.tag==4)
    {
        [super setEditing:YES animated:YES];
        [self.Table4 setEditing:YES animated:YES];
    }
    else
    {
        */

    UIView *view = sender.view;

    int t = sender.view.tag;
     CGPoint point = [sender locationInView:view.superview];

    NSLog(@"its added %f", point.x);
    NSLog(@"its added %f", point.y);
   // view.frame = CGRectMake(sender.view.frame.origin.x, sender.view.frame.origin.y+200,200, 30);
    CGPoint center = view.center;
    center.x = point.x ;
    center.y = point.y ;
    view.center = center;
    [self.view addSubview:view];



  //  int x = Table4.frame.origin.x;
   // int y = Table4.frame.origin.y;

    if (sender.state == UIGestureRecognizerStateChanged) {
        CGPoint center = view.center;
        center.x += point.x - _priorPoint.x;
        center.y += point.y - _priorPoint.y;

       NSLog(@"its Center %f", center.x);


        if (center.x > Table4.frame.origin.x  && 
            center.x < Table4.frame.origin.x  + 
            Table4.frame.size.width &&
            center.y > Table4.frame.origin.y  && 
            center.y < Table4.frame.origin.y  + 
            Table4.frame.size.height
            ) 
        {
            int count = [self.rowdata count];

            if (t>=100 && t<200)
            {
                t=t-100;
                 [self.rowdata insertObject:[listData objectAtIndex:t] atIndex:count];
            }
            else if (t>=200 && t<300)
            {
                 t=t-200;
                 [self.rowdata insertObject:[listData2 objectAtIndex:t] atIndex:count];
            }
            else
            {
                  t=t-300;
                 [self.rowdata insertObject:[listData3 objectAtIndex:t] atIndex:count];
            }           

            //[self.rowdata addObject:[listData objectAtIndex:t]];
            //[sender release];
            [Table4 reloadData];
            [Table1 reloadData];
            [Table2 reloadData];
            [Table3 reloadData];
        }

        view.center = center;
    //}


        _priorPoint = point;
    }
}

これはあなたにとって役立つと思います。これから必要なコードをいくつか取得します。

于 2013-07-23T04:34:45.663 に答える