2013-05-31 4 views
1

Моего анимационного кода прямо сейчас, который работает отлично: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]; 
    }]; 

} 

ответ

2

объявления и присвоения переменной, которая используется для анимации в блок анимации звучит немного странно для меня, попробуйте следующее:

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; 

[UIView animateWithDuration:3 
        delay:0.0 
       options:UIViewAnimationOptionCurveEaseIn 
      animations:^{ 
           self.tableView.frame = oldTableRect; 
           tableView.frame = newTableRect; 
         } 
+0

Пожалуйста, смотрите мой выбор выше. – KaraBenNemsi

+0

Кажется, что вы используете ARC, чтобы получить доступ к переменной экземпляра в блок, вы должны объявить указатель как '__block UITableView * old = self.tableView;', о не перезагруженных данных, обязательно вызовите '[self.tableView reloadData ] 'в новом представлении таблицы после этого вы настроили новые данные, делегат кажется прекрасным – Manu

+0

setupWithDate перезагружает данные self.tableview. Я также попытался использовать указатель с __block. Но все же обе проблемы сохраняются. Старая таблица не перемещается влево, а новая таблица не обновляется. – KaraBenNemsi

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