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 转换到同一个视图的主要内容,如果未能解决你的问题,请参考以下文章