2013-07-13 9 views
9

UITableView'un içerik boyutu, bir ekleme/silme çağrısı yaptıktan sonra güncellendiğinde merak ediyorum. Animasyonun tamamlanmamasına rağmen çerçeve boyutu/içerik boyutunun hemen güncellenmesi en çok [UIView animasyonu ...] bloğu gibi olacağını düşündüm ama bu şekilde görünmüyor. Herhangi bir fikir?UITableView içerik boyutu, satır ekleme/silme animasyonu ile ne zaman güncellenir

+1

Bunu çözdünüz mü? Aynı problemle karşılaşıyorum. Satır ekleme/silme ve ardından tableView.contentSize'nin güncellenmesini beklemek, ancak bu zaman uyumsuz gibi görünüyor. – VaporwareWolf

cevap

0

içerik boyutu yüksekliği hakkında delegelere çağrıda sonra değişti olacak:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section; 
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section; 
+2

Yanıt için teşekkürler. Yine de bana bildirilebilir veya içerik büyüklüğünün değiştiğini söyleyen herhangi bir delege yöntemi var mı? Animasyon tamamlandıktan sonra gerçekleşmiş gibi görünüyor ama ben yeni içerik boyutu BEFORE almayı umuyordum bu yüzden tablo etrafında şeyler canlandırabilir – SLEW

+0

Ben bunu denedim ve tablo deyimi önce ve sonra log deyimleri koydu: heightForRowAtIndexPath: yöntem ve İçerik boyutu güncellenmedi. Ancak, bu bana içerik boyutunun ne olacağını hesaplamak için bana bir çözüm yolunda yardımcı oldu. Çözümü ayrı bir cevap olarak göndereceğim. – Daren

2

Ne yazık ki, ya bir UITableView satırları ekleme/silme zaman contentSize güncellemek için iyi bir yol bulmak mümkün olmamıştır, ancak Eklediğiniz/kaldırdığınız hücrelerin dizin yollarını biliyorsanız, ne olacağını hesaplamanın bir yolunu buldum.

Değiştirilen satırların dizin yolunu kullanarak, ilgili hücrelerin yüksekliğini tableView: heightForRowAtIndexPath: yöntemiyle hesaplayabilir ve tablo görünümünün geçerli içerik boyutu yüksekliğine ekleyebilirsiniz. Eğer sadece bir satır ekliyorsanız İşte bir örnek: Bu sizeThatFits() benziyor

[self.tableView insertRowsAtIndexPaths:@[indexPathOfNewRow] withRowAnimation:UITableViewRowAnimationAutomatic]; 
CGFloat newCellHeight = [self tableView:self.tableView heightForRowAtIndexPath:indexPathOfNewRow]; 
CGFloat newContentSizeHeight = self.tableView.contentSize.height + newCellHeight 
1

bekleyen bir yeni contentSize yüksekliğini maruz bırakabilir. Daha sonra kaydırma animasyonları için bu sorunu çözmek için beklemede olan büyüklüğü atayabilirsiniz. Böyle görünümü denetleyicisi kod yazmak mümkün değilim

extension UIScrollView { 

    var pendingContentSize: CGSize { 
     var tallSize = contentSize 
     tallSize.height = .greatestFiniteMagnitude 
     return sizeThatFits(tallSize) 
    } 

    func scrollToBottom(animated: Bool) { 
     contentSize = pendingContentSize 
     let contentRect = CGRect(origin: .zero, size: contentSize) 
     let (bottomSlice, _) = contentRect.divided(atDistance: 1, from: .maxYEdge) 
     guard !bottomSlice.isEmpty else { return } 
     scrollRectToVisible(bottomSlice, animated: animated) 
    } 

} 

: Böyle bir şey ile

tableView.insertRows(at: [newIndexPath], with: .none) 
tableView.scrollToBottom(animated: true) 

ve tablo alt tüm yol ilerleyin var (yeni kullanılarak içerik boyutu) yerine 2. son satırına (eski içerik boyutunu kullanarak) ilerleyin.

İlgili konular