代码之家  ›  专栏  ›  技术社区  ›  inkredibl

在uiTableView的一个部分中使用选项卡切换动画的类似选项卡的东西

  •  1
  • inkredibl  · 技术社区  · 15 年前

    我的iPhone应用程序中有一个包含部分的uiTableView,它看起来类似于在标准联系人应用程序中查看联系人详细信息。在其中一个部分中,我将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];
    

    我对目标C和Cocoa比较陌生,所以任何建议都很受欢迎。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Jim Dovey    15 年前

    您可以尝试使用单独的表视图,直接在其中设置动画。这里的代码片段是即兴输入的,因此可能需要一些工作,但它至少应该给您一些提示:

    - (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];
    

    希望其中一个能达到预期效果。