如何在没有 NavigationController 的情况下推送子 ViewController?
Posted
技术标签:
【中文标题】如何在没有 NavigationController 的情况下推送子 ViewController?【英文标题】:How to push sub-ViewControllers without NavigationController? 【发布时间】:2011-05-22 19:14:06 【问题描述】:我想将 viewControllers 推送到我的主 viewController 上的一个区域。据我了解,除非您将其添加到 UIWindow,否则您不能使用 NavigationController。
这个动画让人想起 UIScrollView 水平滚动。但我希望它像 NavigationController 一样工作。当用户按下特定操作时,ViewController 将发生变化。
ViewController2 将是一个带有一些其他按钮的 tableView。
ViewController3 将成为从 tableView 更改对象的表单。
【问题讨论】:
【参考方案1】:我最近在 UIView 中发现了一种方法,它可以创建“推送或弹出”的感觉来切换视图。
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
这直接来自 UIView 文档,因此我建议您查看UIView Class Reference 以了解详细信息。基本上,它将一个视图切换到另一个视图,而 options:
部分可让您从多种不同的样式中进行选择。
【讨论】:
你知道如何用这种方法做一个“幻灯片”吗? @DanyalAytekin 我上次查看时,无法通过幻灯片进行转换,但现在可能有更新的选项适用于 ios 7 架构。 UIViewAnimationOptions 是个不错的地方。也可以覆盖动画并插入您自己的动画,但这可能不是最好的主意,因为它可能会变得混乱。 谢谢@slev。我不认为有一个内置的。我最终编写了一个简单的动画。【参考方案2】:我实际上是通过玩 UIView 动画解决了这个问题。
-(void)slideInView:(UIView*)newView toView:(UIView*)oldView
/* Sets the view outside the right edge and adds it to mainView */
newView.bounds = mainView.bounds;
newView.frame = CGRectMake(newView.frame.origin.x + 784, newView.frame.origin.y, newView.frame.size.width, newView.frame.size.height);
[mainView addSubview:newView];
/* Begin transition */
[UIView beginAnimations:@"Slide Left" context:oldView];
[UIView setAnimationDelegate:self];
[UIView setAnimationDelay:0.0f];
[UIView setAnimationDuration:0.5f];
[UIView setAnimationDidStopSelector:@selector(slideInCompleted:finished:context:)];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
newView.frame = CGRectMake(0,0, newView.frame.size.width, newView.frame.size.height);
oldView.frame = CGRectMake(oldView.frame.origin.x - 784, oldView.frame.origin.y, oldView.frame.size.width, oldView.frame.size.height);
[UIView commitAnimations];
-(void)slideInCompleted:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
UIView *view = (UIView*)context;
[view removeFromSuperview];
并使用它
menuController = [[MenuViewController alloc] init];
[self slideOutView:menuController.view toView:loginController.view];
[oldController release];
请记住,您已经分配了一个 UIViewController,您需要在使用完毕后释放它!在示例中,我完成了 loginController 并发布它。
【讨论】:
retainCount
没用。不要叫它。
只要你知道怎么用就行。此外,它不应该在那里,谢谢你的通知。
如果你知道如何使用retainCount,你就会知道永远不要使用它。对于极其罕见的情况,总有更好的方法。【参考方案3】:
如果没有UINavigationController
,绝对没有办法“推动”本机任何控制器。但是,您可以对视图进行动画处理。
对于您发布的示例,看起来简单的UIScrollView
将是您最简单的选择。
【讨论】:
【参考方案4】:我会使用 UIScrollView,因为它能够捕捉到内置的“页面”。您也可以使用 setContentOffset:animated: 滚动到任何部分。
【讨论】:
以上是关于如何在没有 NavigationController 的情况下推送子 ViewController?的主要内容,如果未能解决你的问题,请参考以下文章