Подобная вкладке вещь с анимацией переключателя вкладок в разделе UITableView - PullRequest
1 голос
/ 12 мая 2009

У меня есть приложение UITableView с разделами в приложении для iPhone, которое выглядит примерно так же, как просмотр контактной информации в стандартном приложении контактов. В одном из разделов я установил UISegmentedControl в качестве заголовка раздела, и элементы в этом разделе зависят от того, какой сегмент выбран в сегментированном элементе управления. Я хотел сделать так, чтобы анимации смещали строки одной вкладки за пределы одной стороны и смещали строки другой вкладки с другой стороны. Мне удалось добиться этого, вставив / удалив соответствующие строки с анимацией UITableView по умолчанию для этого, но это выглядит немного странно, когда количество строк в одной вкладке отличается от другой. Также код для этого довольно противный.

Вот код, который у меня есть (немного упрощенный):

[self.tableView beginUpdates];
UITableViewRowAnimation delAnim = UITableViewRowAnimationRight;
UITableViewRowAnimation insAnim = UITableViewRowAnimationLeft;
NSUInteger numdel = [self.list count];
NSUInteger numins = [newlist count];
NSMutableArray* indices = [NSMutableArray arrayWithCapacity: numdel];
for (NSUInteger i = 0; i < numins; i++)
{
    [indices addObject: [NSIndexPath indexPathForRow: i  inSection: SECT]];
}
[self.tableView insertRowsAtIndexPaths: indices  withRowAnimation: insAnim];
[indices removeAllObjects];
for (NSUInteger i = 0; i < numdel; i++)
{
    [indices addObject: [NSIndexPath indexPathForRow: i  inSection: SECT]];
}
[self.tableView deleteRowsAtIndexPaths: indices  withRowAnimation: delAnim];
self.list = newlist;
[self.tableView endUpdates];

Я довольно новичок в Objective C и Cocoa, поэтому любые советы приветствуются.

1 Ответ

3 голосов
/ 12 мая 2009

Вы можете попробовать использовать отдельное табличное представление, в котором вы непосредственно анимируете. Фрагмент, приведенный здесь, напечатан не по назначению, поэтому может потребоваться некоторая работа, но он должен дать вам несколько указателей по крайней мере:

- (void) switchToNewTableFromRight
{
    UITableView * newTableView = [[UITableView alloc] initWithFrame: self.tableView.frame style: self.tableView.style];

    // put it off to the right of the existing table
    CGRect frame = newTableView.frame;
    frame.origin.x += frame.size.width;
    newTableView.frame = frame;

    // set data for new table
    // you should ensure you're setup to supply data for the new table here, btw
    newTableView.delegate = self;
    newTableView.dataSource = self;
    [newTableView reloadData];

    // add to parent of current table view at this (offscreen) location
    [self.tableView.superview addSubview: newTableView];

    // now we animate
    [UIView beginAnimations: @"TableFromRight" context: newTableView];

    // set the function it should call when the animation completes
    [UIView setAnimationDelegate: self];
    [UIView setAnimationDidStopSelector: @selector(animation:finished:context:)];

    // set new table's frame to current table's frame
    newTableView.frame = self.tableView.frame;

    // set current table's frame to be offscreen to the left
    frame = self.tableView.frame;
    frame.origin.x -= frame.size.width;
    self.tableView.frame = frame;

    // commit the animations to start them going
    [UIView commitAnimations];
}

- (void) animation: (NSString *) animationID finished: (BOOL) finished context: (void *) context
{
    // could be a good idea to check that finished == YES here
    UITableView * newTableView = (UITableView *) context;
    self.tableView = newTableView;

    // newTableView has been inited but not autoreleased, etc.
    // now the controller (self) owns it, so release that first reference
    [newTableView release];
}

Идея заключается в том, что вы настраиваете новую таблицу (размер которой совпадает с существующей), размещаете ее за пределами экрана справа от существующей таблицы и затем анимируете движение обеих таблиц влево по их ширине. Таким образом, существующая таблица будет перемещаться за пределы экрана, а новая - на экран. Когда анимация завершится, она вызовет предоставленный метод, что даст вам возможность сделать новое представление таблицы официальным представлением таблицы.

Другой вариант - использовать переворачивающийся переход, который может выглядеть примерно так:

// setup new table
UITableView * newTableView = [[UITableView alloc] initWithFrame: self.tableView.frame style: self.tableView.style];
newTableView.delegate = self;
newTableView.dataSource = self;
[newTableView reloadData];

[UIView beginAnimations: nil context: NULL];
[UIView setAnimationDuration: 1.0];
[UIView setAnimationTransition: UIViewAnimationTransitionFlipFromRight forView: self.tableView.superview cache: YES];

// generally here you'd remove the old view and add the new view
// I'm *assuming* that UITableViewController's -setTableView: will do the same thing
self.tableView = newTableView;

[UIView commitAnimations];

Надеюсь, один из них даст желаемый эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...