테이블 뷰 관리를 단순화하기 위해 클래스 집합을 만들었습니다. 그들이 수행하는 작업 중 하나는 데이터가 업데이트되는 부분을 기반으로 섹션에 diff를 작성한 다음 올바른 삽입, 삭제 및 이동을 적용하는 것입니다.insertRowsAtIndexPaths : reloadRowsAtIndexPaths없이 애니메이션을 적용하지 않습니다.
2 개의 비협조적 인 테이블 뷰를 제외하고 이것은 대부분 내 앱에서 훌륭하게 작동합니다. 테이블 A와 테이블 B라고 부르겠습니다. 개별적으로 작동하는 픽스를 발견했지만 동시에 수정할 수는 없습니다. 차이점이 제대로 생성되었는지 확인했지만 어떤 이유로 각기 다른 애니메이션을 얻습니다.
표 A와 표 B는 단순히 행을 삽입하는 것입니다. 삭제 또는 이동이 없습니다.
코드 아래에서에게 BREAK_TABLE_A
원인 :
- 표 A - 부 = 0 행의 모든 행> = 1 (되지 = 0 행) 위에서 재 애니메이션 동안 아래쪽으로 이동하기. 아주 추한
- 표 B - 좋은 삽입 애니메이션
BREAK_TABLE_B
원인 :
- 표 A - 좋은 삽입 애니메이션
- 표 B - 아니 애니메이션. 이것이 내가 configureCell를 사용하는 개별 셀에 애니메이션을 수행 할 수있는 즉, 동일한 데이터에 대해 동일한 세포를 유지하기 위해 나를 수 있기 때문에 그냥 궁극적으로
reloadData
처럼, 나는 실제로 BREAK_TABLE_B의 방법을 선호 :.
코드는 비교적 간단합니다 :이 문제를 해결하기 위해
UITableViewRowAnimation animation = UITableViewRowAnimationFade;
...
[self.tableView beginUpdates];
NSMutableSet *insertedPaths...;
NSMutableSet *deletedPaths...;
NSMutableSet *refreshPaths...; // Will contain any cell that was present before and after the update.
[self.tableView moveRowsAtIndexPaths:... // Not executed in these examples
...
[self.tableView insertRowsAtIndexPaths:insertedPaths.allObjects withRowAnimation:animation];
[self.tableView deleteRowsAtIndexPaths:deletedPaths.allObjects withRowAnimation:animation];
if (BREAK_TABLE_A){
[self.tableView reloadRowsAtIndexPaths:refreshPaths.allObjects withRowAnimation:UITableViewRowAnimationNone];
} else { //BREAK_TABLE_B - I would prefer this solution if possible
for (NSIndexPath *path in refreshPaths){
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:path];
if (cell){
NSUInteger index = [newSection.rows indexOfObjectPassingTest:^BOOL(LQTableViewRow * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
return [obj.rowIdentifier isEqual:oldSection.rows[path.row].rowIdentifier];
}];
LQTableViewRow *row = newSection.rows[index];
[self configureCell:cell section:newSection row:row];
}
}
}
... update the actual data source ...
[self.tableView endUpdates];
, 나는 위의 [CATransaction begin/commit/flush]
코드뿐만 아니라 [UIView begin/commitAnimations]
블록을 포장 시도했습니다. CATransaction
은 테이블 B를 사용할 때 (일부 다른 애니메이션을 기다리는 중) 오류없이 앱을 정지시킵니다. UIView
두 뷰 (및 앱의 다른 모든 요소)의 애니메이션이 잘못 재생됩니다 (셀이 페이드 인되어 최종 위치의 맨 아래에서 맨 위로 움직입니다. 테이블 뷰의 맨 위에서 맨 위까지).
나는 또한 같은 이상한 결과로 가능한 한 서로 비슷하게 더미 데이터로보기를로드하려고했습니다.