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
, 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
bunu daha önce çözdünüz mü? Burada benzer bir şey yapmaya çalışıyorum ... thx – minovsky
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 –
soru aynı soruyu yanıtlamak emin olacağım :( – OldFox