UIView 转换到同一个视图

Posted

技术标签:

【中文标题】UIView 转换到同一个视图【英文标题】:UIView transitioning to the same view 【发布时间】: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 矩阵的自定义转换。 【参考方案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???

以上是关于UIView 转换到同一个视图的主要内容,如果未能解决你的问题,请参考以下文章

将UIView转换从视图A转换为视图B.

UIView中的坐标转换

IOS-- UIView中的坐标转换

表格视图中的 UIView 转换

iOS UIView中的坐标转换

iOS UIView中的坐标转换