2015-04-16 38 views
9

UITableView satırlarını yeniden yüklerken özel bir animasyon oluşturmak istiyorum. Şey, bazen bu animasyonu kullanmak istemiyorum, bazen satırları yeniden yüklemek için yerleşik animasyon kullanıyordum.reloadRowsAtIndexPaths: withRowAnimation nasıl düzgün bir şekilde geçersiz kılınır?

Peki bunu nasıl yapabilirim? Kendi UITableView uygulamasında reloadRowsAtIndexPaths:withRowAnimation'u geçersiz kılarak mı? Nasıl?

Ya da bir satır yeniden yüklerken kendi animasyonumu elde etmenin daha iyi bir yolu var mı?

cevap

5

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.

+0

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

+0

2 veya daha fazla özel animasyon için cevabımı güncelledim –

+0

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

İlgili konular