Моего анимационного кода прямо сейчас, который работает отлично:IOS анимации одного Вида слева направо
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [cal components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSTimeZoneCalendarUnit) fromDate:[[AXDateManager sharedInstance] currentDate]];
if (forward) {
[UIView transitionWithView:self.tableView
duration:ANIMATIONDURATION
options:UIViewAnimationOptionTransitionCurlUp
animations:^{
/* maybe animation to hide your other views */
} completion:^(BOOL finished) {
/* remove the required views */
}];
[components setDay:components.day + 1];
} else {
[UIView transitionWithView:self.tableView
duration:ANIMATIONDURATION
options:UIViewAnimationOptionTransitionCurlDown
animations:^{
/* maybe animation to hide your other views */
} completion:^(BOOL finished) {
/* remove the required views */
}];
[components setDay:components.day - 1];
}
[self setupWithDate:[cal dateFromComponents:components]];
Теперь я хочу, чтобы перейти к анимации слева направо. Но я столкнулся с несколькими проблемами. Одна из вещей, которые я пытался копировал оригинальный TableView с
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableView];
UITableView *tableView = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
[tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"];
и настройка делегата и источник данных для новой таблицы и удаление делегата и источник данных из старого. Но почему-то новый никогда не настраивается должным образом, поэтому он не будет отображать данные на своих ячейках. Это была анимация, которую я пытался использовать:
[UIView animateWithDuration:3
delay:0.0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
CGRect oldTableRect = self.tableview.frame;
CGRect newTableRect = tableView.frame;
oldTableRect.origin.x = oldTableRect.origin.x - oldTableRect.size.width;
newTableRect.origin.x = newTableRect.origin.x - newTableRect.size.width;
self.tableView.frame = oldTableRect;
tableView.frame = newTableRect;
}
Но с вышеуказанной анимацией какая-то одна из таблиц никогда не двигалась.
То, что я хочу добиться:
- self.tabelview должен двигаться влево от экрана
- в то же время новый TableView (уже загружен с новыми данными) должны исходить от левой и принять Исходное положение self.tablview
- новый TableView также должен заменить старую и старую должно быть полностью удалены
несколько более подробной информации:
- UIViewController из self.tableview был экземпляр с раскадровки
- делегат и источник данных из self.tableview были установлены программно в viewdidload
Каков наилучший подход? Могу ли я достичь анимации слева направо с помощью одной таблицы, аналогичной моей оригинальной анимации, с керлинг вверх и вниз?
EDIT Так вот что я пробовал. Две вещи, которые не работают. Старый стол не перемещается влево. Новая таблица перемещается правильно, но не настраивается с данными.
if (forward) {
NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:self.tableView];
UITableView *tableView = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData];
[tableView registerNib:[UINib nibWithNibName:@"Cell" bundle:nil] forCellReuseIdentifier:@"Cell"];
// for debugging
[self.tableView setBackgroundColor:[UIColor yellowColor]];
[tableView setBackgroundColor:[UIColor redColor]];
tableView.frame = self.tableView.frame;
CGRect rect = tableView.frame;
// -20 for debugging
rect.origin.x = rect.origin.x + rect.size.width - 20;
tableView.frame = rect;
[self.view addSubview:tableView];
tableView.dataSource = self;
tableView.delegate = self;
// keep reference to old tableview
UITableView *old = self.tableView;
self.tableView = tableView;
// setup new tableview with data
[components setDay:components.day + 1];
[self setupWithDate:[cal dateFromComponents:components]];
CGRect oldTableRect = old.frame;
CGRect newTableRect = tableView.frame;
oldTableRect.origin.x = oldTableRect.origin.x - oldTableRect.size.width;
newTableRect.origin.x = newTableRect.origin.x - newTableRect.size.width;
[UIView animateWithDuration:3
delay:0.0
options:UIViewAnimationOptionCurveEaseIn
animations:^{
old.frame = oldTableRect;
self.tableView.frame = newTableRect;
}
completion:^(BOOL finished) {
[old removeFromSuperview];
}];
}
Пожалуйста, смотрите мой выбор выше. – KaraBenNemsi
Кажется, что вы используете ARC, чтобы получить доступ к переменной экземпляра в блок, вы должны объявить указатель как '__block UITableView * old = self.tableView;', о не перезагруженных данных, обязательно вызовите '[self.tableView reloadData ] 'в новом представлении таблицы после этого вы настроили новые данные, делегат кажется прекрасным – Manu
setupWithDate перезагружает данные self.tableview. Я также попытался использовать указатель с __block. Но все же обе проблемы сохраняются. Старая таблица не перемещается влево, а новая таблица не обновляется. – KaraBenNemsi