UIView转换到相同的视图

时间:2013-02-19 15:42:30

标签: ios uitableview uiview transition uiviewanimationtransition

我有一个显示静态UITableView的{​​{1}}控制器。我必须更新提供辅助模式的项目,其中tableview应该翻转并显示不同的数据。我的方法是将两种模式的所有静态单元格放在一个大的静态tableview中,以执行翻转并隐藏在特定时刻不需要的单元格。翻转应仅在tableview上执行,因此不会影响tableviewcontrollerview或主navigationbar。到目前为止,我一直试图用来实现这个简单的魔术的代码是:

tabbar

不幸的是结果是黑屏。知道怎么解决吗?

3 个答案:

答案 0 :(得分:7)

请尝试使用以下代码:

[UIView transitionWithView:self.tableView 
                   duration:0.7
                   options:UIViewAnimationOptionTransitionFlipFromLeft 
                   animations:^{
                          /* any other animation you want */
                  } completion:^(BOOL finished) {
                          /* hide/show the required cells*/
                  }];

答案 1 :(得分:1)

我认为主要问题是,视图最多可以有一个超级视图。这意味着视图不能同时在两个地方。我会尝试将视图捕获为图像,并在动画之前将其添加到其超级视图上,并从其超视图中删除真实的tableview。然后,您可以在两个不同的视图(图像视图和表视图)之间设置动画。在完成块中,只需删除图像视图。

如何捕获视图:How to capture current view screenshot and reuse in code? (iPhone SDK)

答案 2 :(得分:1)

我使用略有不同的技术完成了这项工作。也许它对你有用。基本结构是有一个MainContainerView,里面是一个MapView(在你的情况下是一个表视图)。当我进行翻转动画时,我抓住一个单独的视图控制器(列表视图)的视图,并将其作为子视图添加到MainContainerView并从子视图中删除MapView。当我想要倒退时,我会做相反的事情。

-(void)listViewButtonHandler:(id)sender
{
    if (_isMap) { //transition to view 2

        self.listViewController.view.frame = self.mainContainerView.bounds; //grab the view of a separate VC

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
                               forView:self.mainContainerView
                                 cache:YES];
        [self.mapContainerView removeFromSuperview];
        [self.mainContainerView addSubview:self.listViewController.view];

        [UIView commitAnimations];
        self.navigationItem.leftBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"mapButton"] target:self action:@selector(listViewButtonHandler:)]; //change the button to another title

        _isMap = NO;
    } else {
        //transition to view 1
        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:1.0];
        [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft
                               forView:self.mainContainerView
                                 cache:YES];
        [self.listViewController.view removeFromSuperview];
        [self.mainContainerView addSubview:self.mapContainerView];

        [UIView commitAnimations];
        _isMap = YES;
        self.navigationItem.leftBarButtonItem = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"actualListButton"] target:self action:@selector(listViewButtonHandler:)]; //change the button back

    }
}

我希望这有用,它可以适用于您的情况!