2010-11-04 12 views
6

Xin chào các bạn. tôi có một vấn đề với hoạt hình xóa và chèn trên một UITableView. Thực tế ist, rằng tôi có cellheights khác nhau, một số 44,0 một số 135,0 bây giờ. tôi có uitableviewstylegrouped với các phần khác nhau. hàng đầu tiên của mỗi phần là một hàng nhóm. khi nhấp vào tôi xóa tất cả các hàng của phần này ngoại trừ hàng nhóm. nhưng hoạt ảnh đó trông kỳ lạ, khi hoạt ảnh (UITableViewRowAnimationTop) ô chiều cao 135px. tôi đã cố gắng để thiết lập self.tableview.cellheight đến 135 và nhận xét ra tableView: cellHeightForIndexPath-Method. Và hoạt hình hoạt động tốt. Hoặc tôi thiết lập tất cả các cellheight đến 135 trong tableView: cellHeightForIndexPath-Method.Sự cố với RowAnimation

Dường như quy trình hoạt ảnh kiểm tra độ cao của hàng đầu tiên trong các phần, mất chiều cao của ô cho tất cả các ô sau đây hoạt ảnh.

Ai đó là một ý tưởng?


- (void) showhideGroup:(int)group 
{ 
    NSMutableArray *indexPaths = [[NSMutableArray alloc] init]; 

    MCGroup *handleGroup = [groups objectAtIndex:group]; 
    NSMutableArray *groupRows = [visibleGroupData objectForKey:handleGroup.title]; 

    [self.tableView beginUpdates]; 

    if (!handleGroup.hidden) { 
     int row = 0; 
     for(MobileFieldMapping *field in groupRows) 
     { 
      if (![field.datatype matchesInsensitive:GROUPING_CELL]) 
      { 
       NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group]; 
       [indexPaths addObject:path]; 
      } 
      row++; 
     } 

     row = 0; 
     for(NSIndexPath *index in indexPaths) 
     { 
      [groupRows removeObjectAtIndex:index.row-row]; 
      row++; 
     } 
     [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     handleGroup.hidden=YES; 
    } 
    else 
    { 
     NSMutableArray *allGroupRows = [groupData objectForKey:handleGroup.title]; 

     int row = 0; 
     for (MobileFieldMapping *field in allGroupRows) 
     { 
      if (![groupRows containsObject:field]) 
      { 
       NSIndexPath *path = [NSIndexPath indexPathForRow:row inSection:group]; 
       [indexPaths addObject:path]; 
       [groupRows insertObject:field atIndex:row]; 
      } 
      row++; 
     } 

     [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; 
     handleGroup.hidden=NO; 
    } 
    [self.tableView endUpdates]; 


    [indexPaths release]; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    if ([cell isKindOfClass:[FormCell class]]) 
    { 
     return [(FormCell*)cell height]; 
    } 

    return 44.0; 
} 
+0

bạn nên đăng bảng xem mã nguồn của đại biểu. – karim

+0

ok không ai có ý tưởng ... có vẻ như vậy – kaelum

+0

Tôi đã làm việc này, vì vậy tôi nghĩ rằng đó là một lỗi trong mã của bạn. Bạn cần phải đăng các mã ĐẦY ĐỦ, hoặc (tốt hơn) làm cho một ví dụ nhỏ hơn của vấn đề. Ngoài ra, bạn cần phải cụ thể hơn trong việc mô tả chính xác cách nó "trông kỳ lạ" - không ai có thể giúp bạn với sự mơ hồ như vậy. – Adam

Trả lời

0

Cũ vẫn chưa được trả lời. Tôi cho rằng bạn đã tìm ra nó từ lâu rồi, nhưng đây là suy nghĩ đầu tiên của tôi. (Tôi nhớ là cố gắng tự làm một việc như thế này.)

Khi gọi UITableViewheightForRowAtIndexPath:, nó sẽ là vì bảng đang chuẩn bị ô, vì vậy bạn không thể sử dụng ô để trả về chiều cao. Điều này có thể gây ra một hồi quy vô hạn trong các cuộc gọi hoặc nó có thể phát hiện điều này và chỉ cần bỏ hoặc ném một ngoại lệ và để bạn giữ túi.

Bạn phải tính chiều cao ô mà không sử dụng chính ô đó.

Đối với giả định chiều cao ô, hãy thử gọi chèn/xóa cho từng ô chứ không phải là một cuộc gọi duy nhất để thực hiện tất cả cùng một lúc. Các UITableView vẫn sẽ batch chúng lên cho các hình ảnh động sau khi bạn gọi endUpdates.

2

Tôi đã gặp vấn đề tương tự. workaround của tôi là sử dụng phần phai hoạt hình:

[tableView reloadSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 

Thay vì một cho các yếu tố:

[tableView deleteRowsAtIndexPaths:tmpArray withRowAnimation:UITableViewRowAnimationTop]; 

này trông mượt mà hơn nhiều.