2010-09-30 2 views
80

Есть ли способ указать продолжительность анимации строк UITableView или получить обратный вызов при завершении анимации?Продолжительность анимации строки UITableView и обратный вызов завершения

Что бы я хотел сделать, это прокрутить указатели прокрутки после завершения анимации. Выполнение вспышки перед этим ничего не делает. До сих пор обходной путь у меня есть, чтобы задержать половину второго (что, кажется, продолжительность анимации по умолчанию), то есть:

[self.tableView insertRowsAtIndexPaths:newRows 
         withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView performSelector:@selector(flashScrollIndicators) 
        withObject:nil 
        afterDelay:0.5]; 
+0

Я не пробовал сам, но, возможно, это может сделать это с некоторой обработкой индекса пути: '- (ничтожной) Tableview: (UITableView *) tableView didEndDisplayingCell: (UITableViewCell *) cell forRowAtIndexPath: (NSIndexPath *) indexPath' – Kalle

ответ

-8

Вы могли бы попытаться обернуть insertRowsAtIndexPath в сделке

- (void)beginUpdates 
- (void)endUpdates 

, затем сделайте вспышку позже.

+0

См. ответ karwag выше.Вам нужно решить проблему того, что считается «потом». – JLundell

169

Только что наткнулся на это. Вот как это сделать:

Objective-C

[CATransaction begin]; 
[tableView beginUpdates]; 
[CATransaction setCompletionBlock: ^{ 
    // Code to be executed upon completion 
}]; 
[tableView insertRowsAtIndexPaths: indexPaths 
       withRowAnimation: UITableViewRowAnimationAutomatic]; 
[tableView endUpdates]; 
[CATransaction commit]; 

Swift

CATransaction.begin() 
tableView.beginUpdates() 
CATransaction.setCompletionBlock { 
    // Code to be executed upon completion 
} 
tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) 
tableView.endUpdates() 
CATransaction.commit() 
+0

Я не пробовал, но это выглядит многообещающе. –

+0

Я пробовал это (сейчас), и, похоже, все работает отлично. Бонус: это означает, что вы также можете использовать CATransaction для установки продолжительности анимации и функции синхронизации. Ницца! – JLundell

+0

В дальнейших экспериментах поведение этого механизма в этом контексте кажется в лучшем случае неустойчивым. Также обратите внимание, что в документации говорится, что она применяется только к анимации, добавленной после вызова. – JLundell

-5

Override Tableview -insertRowsAtIndexPaths: и реализовать пользовательский ввод/(или удаление с его собственным метод) анимация, которую вы хотите. Я не пытался это сделать.

37

Расширение на karwag's fine answer, обратите внимание, что на iOS 7, окружающем CATransaction с анимацией UIView, вы можете контролировать продолжительность анимации таблицы.

[UIView beginAnimations:@"myAnimationId" context:nil]; 

[UIView setAnimationDuration:10.0]; // Set duration here 

[CATransaction begin]; 
[CATransaction setCompletionBlock:^{ 
    NSLog(@"Complete!"); 
}]; 

[myTable beginUpdates]; 
// my table changes 
[myTable endUpdates]; 

[CATransaction commit]; 
[UIView commitAnimations]; 

Продолжительности UIView Animation не имеет никакого влияния на прошивке 6. Возможно, IOS 7 столов анимация реализована по-разному, на уровне UIView.

+0

Это прекрасно работало для me on ios 7 –

+0

Продолжительность анимации, как представляется, игнорируется. – Dustin

23

Укорачивание Brent's fine answer, по крайней мере IOS 7 вы можете обернуть все это сжаты в [UIView animateWithDuration: Задержка: Варианты: анимация: завершение:] называют:

[UIView animateWithDuration:10 delay:0 options:UIViewAnimationOptionCurveEaseInOut animations:^{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} completion:^(BOOL finished) { 
    // completion code 
}]; 

, хотя, я не могу, кажется, переопределить кривую анимации по умолчанию из ничего, кроме EaseInOut.

+2

При выполнении строки вставить этот путь или путь @ Брента, хотя продолжительность соблюдается, UITableViewRowAnimation, похоже, не соблюдается и всегда кажется, что анимация сверху вниз, даже когда я указываю, например, UITableViewRowAnimationLeft. Тестирование на iOS 8.4 - у кого-нибудь есть решение? – Danny

5

Для меня это было необходимо для коллекцииView. Я сделал простое расширение для решения этого:

extension UICollectionView { 

    func reloadSections(sections: NSIndexSet, completion:() -> Void){ 
     CATransaction.begin() 
     CATransaction.setCompletionBlock(completion) 

     self.reloadSections(sections) 

     CATransaction.commit() 
    } 

} 
19

Вот Swift версия karwag's answer

CATransaction.begin() 
    tableView.beginUpdates() 
    CATransaction.setCompletionBlock {() -> Void in 
     // your code here 
    } 
    tableView.insertRowsAtIndexPaths(indexArray, withRowAnimation: .Top) 
    tableView.endUpdates() 
    CATransaction.commit() 
14

Это один ад полезный трюк! Я написал расширение UITableView, чтобы не писать всю информацию CATransaction.

import UIKit 

extension UITableView { 

    /// Perform a series of method calls that insert, delete, or select rows and sections of the table view. 
    /// This is equivalent to a beginUpdates()/endUpdates() sequence, 
    /// with a completion closure when the animation is finished. 
    /// Parameter update: the update operation to perform on the tableView. 
    /// Parameter completion: the completion closure to be executed when the animation is completed. 

    func performUpdate(_ update:()->Void, completion: (()->Void)?) { 

     CATransaction.begin() 
     CATransaction.setCompletionBlock(completion) 

     // Table View update on row/section 
     beginUpdates() 
     update() 
     endUpdates() 

     CATransaction.commit() 
    } 

} 

Это используется следующим образом:

// Insert in the tableView the section we just added in sections 
self.tableView.performUpdate({ 
      self.tableView.insertSections([newSectionIndex], with: UITableViewRowAnimation.top) 

     }, completion: { 
      // Scroll to next section 
      let nextSectionIndexPath = IndexPath(row: 0, section: newSectionIndex) 
      self.tableView.scrollToRow(at: nextSectionIndexPath, at: .top, animated: true) 
     }) 
+0

Удивительный ответ! это одна из причин, по которым я люблю Swift –

Смежные вопросы