【问题标题】:UIView transitioning to the same viewUIView 转换到同一个视图
【发布时间】:2013-02-19 15:42:30
【问题描述】:

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

// Transition using a page flip.
    [UIView transitionFromView:self.tableview
                        toView:self.tableview
                      duration:0.7
                       options:UIViewAnimationOptionTransitionFlipFromLeft
                    completion:^(BOOL finished) {
                        if (finished) {
                           /* HIDE NOT REQUIRED CELL */

                        }
                }];

不幸的是,结果是黑屏。知道如何解决吗?

【问题讨论】:

  • 我只能建议使用 CGAffineTranform 矩阵的自定义转换。

标签: ios uitableview uiview transition uiviewanimationtransition


【解决方案1】:

尝试使用以下代码:

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

【讨论】:

  • 我相信这里的问题(我只是在没有转换到同一个视图的情况下遇到的)是由其他动画取消或以其他方式干扰转换引起的。过渡可能会被取消,使其处于从不调用完成块的状​​态。对我来说,这导致了黑屏,因为我的完成块正在操纵我的应用程序的根视图控制器,以从入门体验过渡到主要用户体验。希望这对某人有帮助!
【解决方案2】:

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

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

【讨论】:

  • 这看起来很忍术,但我会试一试。如果您有时间发布一些示例代码将不胜感激;)
【解决方案3】:

我使用稍微不同的技术完成了这项工作。也许它对你有用。基本结构是有一个 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

    }
}

我希望这会有所帮助,并且可以适用于您的情况!

【讨论】:

  • 嘿,感谢您的快速回答。马上尝试,如果有效,我会告诉您...
  • 调整代码的诀窍在于,您有一个主容器视图,您可以在其上应用动画,在此期间删除子视图。我没有子视图,只有表格视图。不知道我是否清楚
  • 对,您可以重组您的代码以拥有UIView,即MainContainerView,并在其中放置您的TableView。在单独的viewcontroller你可以有你的第二个TableView???
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多