2013-04-27 69 views
5

我想能夠在另一個單元格上拖動一個單元格,並且當我釋放時它將有效地「合併」單元格(顯示另一個單元格)。我不確定UITableView是最佳控制還是UICollectionView。有沒有人有任何想法如何進行?合併UITableViewCells

+0

意思是說,你想把兩個單元合併成一個。對? – 2013-04-27 06:07:27

+0

這是正確的。我想從UITableView中「取消」現有的單元格,將它移到現有的單元格上(提供指示哪個單元格),然後刪除有效合併它的單元格。下面的集合是一個「合併模型」和「獨立模型」的包。 – Clay 2013-04-29 16:07:30

+0

完成!這並不像我想象的那麼糟糕。 – Clay 2013-05-03 21:33:43

回答

2

下面是我用僞代碼開發它的解決方案。

  1. 添加UILongPressGestureRecognizer到UITableView的
  2. UIGestureRecognizerStateBegan,使用[UITableView indexPathForRowAtPoint],以確定正在「長按」是什麼細胞。你將把這個單元格變成懸停UITableViewCell
  3. 將參考變量設置爲相應的模型對象。
  4. 使用UIGraphicsBeginImageContextWithOptions來呈現實際的UITableViewCell內容的圖像。創建一個UIImageView並添加一些自定義鉻(陰影等)
  5. 將自定義UIImageView作爲子視圖添加到UITableView,並刪除原始選擇固定 UITableViewCell(removeFromSuperview)。
  6. UIGestureRecognizerStateChanged,計算懸停UITableViewUITableViewCell的位置和動畫釘扎細胞。 (您還需要切換先前突出顯示的固定格單元的動畫)。
  7. 當用戶發佈LongPress時,您需要重新訂購模型陣列,刪除底層的固定的單元格,然後在beginUpdates調用中重新加載UITableView

還有一些其他的事情要注意,如滾動,當你打的邊界條件,在原來的位置下降懸停細胞等但這是它的基本精神。希望有幫助。

+0

你有這樣的一些示例代碼?我試圖做同樣的事情,但沒有多少運氣。 – Imran 2015-11-29 12:30:18

4

可能是我沒有得到你,但正如我得到的,你想通過拖動合併單元格,所以實現一些代碼給你。看看這個。

如果妳想做這樣的事情...

Screenshot

使用編輯代碼這樣的:---

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

試試這個sampleCode

+0

爲什麼不在'moveRowAtIndexPath'' if'使用'!='運算符? – 2013-07-22 19:05:07

+0

這是問題的一個簡單部分,做一個很好的過渡來合併單元格將是一件困難的事情。 – Can 2013-07-22 19:11:10

+0

是的,您需要通過在'heightForRowAtIndexPath:'方法中更改單元格來保存單元格的高度。 – 2013-07-22 19:31:45

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

我認爲這對你很有幫助。採取一些你想要的代碼。