reloadRowsAtIndexPaths:withRowAnimation
'u geçersiz kılmamalısınız. Sadece UITableView kategorisinde özel bir yöntem reloadRowsWithMyAnimationAtIndexPaths:
uygulayın ve gerektiğinde kullanın.
Ama UITableView en alt sınıfında bu yöntemi geçersiz kılmak istiyorsanız, bunu yapabilirsiniz:
- (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths
withRowAnimation:(UITableViewRowAnimation)animation {
if (self.useMyAnimation)
[self reloadRowsWithMyAnimationAtIndexPaths:indexPaths];
else
[super reloadRowsAtIndexPaths:indexPaths withRowAnimation:animation];
}
self.useMyAnimation animasyon kullanan ne gösterir sadece bir bayrak (BOOL özelliği) 'dir. Yeniden yüklemeden önce bu bayrağı ayarlayın.
2 veya daha fazla customAnimations için, enum uygulamak olabilir:
enum MyTableViewReloadAnimationType {
case None
case First
case Second
case Third
}
Sonra (örneğin, reloadAnimationType için) MyTableViewReloadAnimationType özelliği yapıp anahtarı ile uygun bir animasyon yöntemini seçin:
var reloadAnimationType = MyTableViewReloadAnimationType.None
override func reloadRowsAtIndexPaths(indexPaths: [AnyObject], withRowAnimation animation: UITableViewRowAnimation) {
switch self.reloadAnimationType {
case .None:
super .reloadRowsAtIndexPaths(indexPaths, withRowAnimation:animation)
default:
self .reloadRowsAtIndexPaths(indexPaths, withCustomAnimationType:self.reloadAnimationType)
}
}
func reloadRowsAtIndexPaths(indexPaths: [AnyObject], withCustomAnimationType animationType: MyTableViewReloadAnimationType) {
switch animationType {
case .First:
self .reloadRowsWithFirstAnimationAtIndexPaths(indexPaths)
case .Second:
self .reloadRowsWithSecondAnimationAtIndexPaths(indexPaths)
case .Third:
self .reloadRowsWithThirdAnimationAtIndexPaths(indexPaths)
}
}
Yapabilirsin özel yöntemi reloadRowsAtIndexPaths:withCustomAnimationType:
doğrudan arayın:
self.tableView .reloadRowsAtIndexPaths([indexPath], withCustomAnimationType: MyTableViewReloadAnimationType.First)
özel bir yöntem İçinde
Eğer dataSource yöntemi ile güncel bir hücreyi ve yeni bir hücreyi almak gerekir:
func reloadRowsWithFirstAnimationAtIndexPaths(indexPaths: [AnyObject]) {
for indexPath in indexPaths {
var currentCell = self .cellForRowAtIndexPath(indexPath as! NSIndexPath)
var newCell = self.dataSource .tableView(self, cellForRowAtIndexPath: indexPath as! NSIndexPath)
var newCellHeight = self.delegate .tableView(self, heightForRowAtIndexPath: indexPath)
var frame: CGRect = currentCell.frame
frame.size.height = newCellHeight
newCell.frame = frame
self .replaceCellWithFirstAnimation(currentCell!, withAnotherCell: newCell);
}
}
func replaceCellWithFirstAnimation(firstCell : UITableViewCell, withAnotherCell secondCell: UITableViewCell) {
var cellsSuperview = firstCell.superview!
//make this with animation
firstCell .removeFromSuperview()
cellsSuperview .addSubview(secondCell)
}
Bir durumun üstesinden gelmek için gerektiğinde newCell yüksekliği> veya sonra < currentCell boyu. Diğer tüm hücre çerçeveleri yeniden hesaplanmalıdır. Ben beginUpdates ve endUpdates yöntemleri ile yapılabilir düşünüyorum. Hücrelerle manipülasyondan önce onları arayın.
Nesne C için endişelenmeyin. Yazmam gerekmediği sürece onu okuyabilirim ... 'self.useMyAnimation' ile ilgili olarak bunu nasıl kullanırsınız? Aynısını yaptım ki, eğer 'animasyon', başka bir yol bulamadığım için sıfır ya da değil. Ama iki özel canavarım varsa, uygun bir çözümden daha çok bir hack. Ve hücreyi nasıl yeniden yüklersin? – Nico
2 veya daha fazla özel animasyon için cevabımı güncelledim –
Sorunu "reloadRowsAtIndexPaths: withRowAnimation" olarak çağırdığınızda, "UITableViewRowAnimation" ile yalnızca animasyonun türünü belirtebilirsiniz (yanlışsa beni düzelt). Ve reloadRowsAtIndexPaths: withRowAnimation' için yalnızca bir bildirim var. Bu yöntemi geçersiz kılmamaya ve özel bir yeniden yükleme yöntemi kullanmaya devam etmeme rağmen, hücreyi nasıl yeniden yükleyeceksiniz? – Nico