2013-11-15 14 views
10

Diğer satırlardan farklı bir yüksekliğe sahip bir UITableView'da bir satırın eklenmesini veya kaldırılmasını canlandırırken bir sorun yaşıyorum.Bir UITableView'a daha büyük bir satır eklerken, yanlış bir yükseklik varsa, animasyon

Aşağıdaki gifler, varsayılan yükseklik (44pts) satırları ve daha büyük bir satırın (100pt) eklenmesi ve kaldırılmasıyla sorunu gösterir. Soldaki, simülatörden gelen bir ekran kaydıdır (yeni hücrenin kapanış sırasındaki beş hücre farklı bir konudur) ve sağdaki, yapması gereken şeyin bir örneğidir. Benim durumumda

gif of animation issuegif of how it should look , ben satırların bir demet yüksekliğinde her 60pts var. Hücredeki bir tuşa dokunduğunda, alt hücreleri aşağı iterek bir "düzenle" hücresi alttan dışarı doğru kayacaktır. Bu düzenleme hücresi 180pts yüksekliğindedir. insertRowsAtIndexPaths:withRowAnimation: veya deleteRowsAtIndexPaths:withRowAnimation:'u çağırdığımda, animasyon 60pts yerine yanlış 60pts yüksekliğini varsayar,
olması gerekir. Bu, UITableViewRowAnimationTop olması durumunda yeni hücrenin -60pts'de biteceği konumdan göründüğü anlamına gelir ve yeni konumuna kaydırır; Animasyonun yaklaşık üçte biri yapmalıdır. Bu sırada, aşağıdaki satır, başlangıç ​​pozisyonundan tam olarak gerektiği gibi 180pts aşağı doğru düzgün animasyonlar.

Hiç kimse bunun için gerçek bir çözüm geliştirdi mi? Yeni sıranın animasyon için ne kadar yüksek olması gerektiğini anlamanın bir yolu var mı?

Düzenleme satırını gizlemek ve göstermek için kullanıyorum kod aşağıdadır. Bu net bir cevap ortak bir sorundur gibi düzenlemek tetiklemek için bir TLSwipeForOptionsCell kullanıyorum, ancak kolayca biraz poking örnek tableView:didSelectRowAtIndexPath:

-(void)hideEditFields{ 
    [self.tableView beginUpdates]; 

    [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:editFormVisibleForRow+1 inSection:0]] withRowAnimation:UITableViewRowAnimationTop]; 
    editFormVisibleForRow = -1; 

    [self.tableView endUpdates]; 
} 

-(void)cellDidSelectMore:(TLSwipeForOptionsCell *)cell{ 
    NSIndexPath* indexPath = [self.tableView indexPathForCell:cell]; 
    // do nothing if this is the currently selected row 
    if(editFormVisibleForRow != indexPath.row){ 
     if(editFormVisibleForRow >= 0){ 
      [self hideEditFields]; 
      // update the index path, as the cell positions (may) have changed 
      indexPath = [self.tableView indexPathForCell:cell]; 
     } 

     [self.tableView beginUpdates]; 

     editFormVisibleForRow = indexPath.row; 
     [self.tableView insertRowsAtIndexPaths:@[ 
              [NSIndexPath indexPathForItem:editFormVisibleForRow+1 inSection:0] 
              ] withRowAnimation:UITableViewRowAnimationTop]; 

     [self.tableView endUpdates]; 
    } 
} 

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return _dataSource.count + (editFormVisibleForRow >= 0 ? 1 : 0); 
} 

-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    int row = indexPath.row; 
    if(editFormVisibleForRow >= 0 && row > editFormVisibleForRow && row <= editFormVisibleForRow + 1){ 
     return 180.0f; 
    } 
    else return 60.0; 
} 

için kullanmakta çoğaltılmış oluyor, öyle görünüyor. Burada SO'da bulduğum benzer soruların çoğu cevapsızdır veya askerin durumuna özel çözümler sunar. (örnekler: Problem with RowAnimation, Custom UITableViewCell height yields improper animation, UITableView animation glitch when deleting and inserting cells with varying heights).

Ayrıca, üç boyutlu bir düzenleme satırı oluşturmaya çalışmak yerine, üç tane daha küçük satır yapmayı ve onları canlandırmayı denedim, ancak bunların hepsi bir seferde ortaya çıktığı için uygun değildi. Ayrıca onları birbiri ardına canlandırmayı denedim, ancak hareketler, tek bir hareketle görünümden kayan tüm düzenleme görünümü yerine, 3 adımlık belirgin bir animasyonla, garip görünmesini sağladı.

Düzenleme: Anlatmaya çalıştığım satırın üstündeki satır için reloadRowsAtIndexPaths:withRowAnimation: UITableViewRowAnimationNone'u çağırırsam animasyonun davranışını değiştirdiğini fark ettim; animasyon, aşağıdaki animasyonda gösterildiği gibi yüksekliğin 0pt olduğunu varsayar. animasyon hızı yanlış olduğunu ve

gif of issue with previous row reloaded

+0

bunu daha önce çözdünüz mü? Burada benzer bir şey yapmaya çalışıyorum ... thx – minovsky

+0

Maalesef müşteri tasarımı üzerimizde değiştirdi ve bu işlevsellik artık gerekli olmadı, ben asla çözmedim.Eğer ben tekrar bir kez rastlamak ve çözmek, ben –

+1

soru aynı soruyu yanıtlamak emin olacağım :( – OldFox

cevap

-1

Bu, didSelectRowAtIndexPath çalışmış kullanarak (benim uygulamasında bu arka plan renk yoluyla pokes anlamına gelir) bir boşluk bırakır gibi, ne istiyorum daha yakın, ama yine de doğru değil Benim için: silme için

@interface TableController() 
@property (strong,nonatomic) NSArray *theData; 
@property (strong,nonatomic) NSIndexPath *pathToEditCell; 
@end 

@implementation TableController 


- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.theData = @[@"One",@"Two",@"Three",@"Four",@"Five",@"Six",@"Seven",@"Eight",@"Nine"]; 
    [self.tableView reloadData]; 
} 


-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return ([indexPath isEqual:self.pathToEditCell])? 100: 44; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return (self.pathToEditCell == nil)? self.theData.count: self.theData.count + 1; 
} 


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([indexPath isEqual:self.pathToEditCell]) { 
     RDEditCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EditCell" forIndexPath:indexPath]; 
     return cell; 
    }else{ 
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; 
     cell.textLabel.text = self.theData[indexPath.row]; 
     return cell; 
    } 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

    if (self.pathToEditCell == nil) { // first time selecting a row 
     self.pathToEditCell = [NSIndexPath indexPathForRow:indexPath.row +1 inSection:indexPath.section]; 
     [self.tableView insertRowsAtIndexPaths:@[self.pathToEditCell] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    }else if ([self.pathToEditCell isEqual:indexPath]){ // deletes the edit cell if you click on it 
     self.pathToEditCell = nil; 
     [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    }else{ // close the old edit cell and adds another if you click on another cell while the edit cell is on screen 
     [self.tableView beginUpdates]; 
     [self.tableView deleteRowsAtIndexPaths:@[self.pathToEditCell] withRowAnimation:UITableViewRowAnimationFade]; 
     self.pathToEditCell = indexPath; 
     [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
     [self.tableView endUpdates]; 
    } 
} 

, ben de ok animasyon için "solma" seçeneğinin görünüyor, ama "top" gibi.

+1

Kodunuzda aynı sorun var.Kaplama hücresi sadece 100pts yerine -44pts'den kayıyor, bu da hücreyi aşağı kaydırmak yerine merkezden genişliyor gibi gösteriyor. İşte sorunu göstermek için bir gif: http : //i34.photobucket.com/albums/d135/death_au/cell-anim-issue.gif –

+0

@death_au, sanırım sorununuzu yanlış anladım - sadece yeni hücrenin bir parçasını gördüğünüzü sanıyordum. Bu animasyonda yanlış bir şey görmüyorum - bana iyi görünüyor, ne hakkında konuştuğunuzu fark etmedim bile, yavaşlatıncaya kadar ... Bu konuda bir yol bilmiyorum. – rdelmar

İlgili konular