我在做什么:
在我的应用中,我使用以下代码呈现模态视图控制器(包含应用设置):
optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
[self presentModalViewController:optionsViewController animated:YES];
此转换只是卷起视图的底部以显示一些设置。 (请参阅“地图”应用程序中的示例。)当您点击页面的上半部分时,原始视图仍然存在但灰显,模态视图控制器将自动关闭(由操作系统处理,我没有' t代码)。
-
什么行不通:
这在iOS 4中运行良好(我的应用程序目前正在App Store上运行)。但在iOS 5中,看起来苹果已经改变了这种转变的行为,视图控制器不再自我贬低。我试图复制之前由操作系统处理的行为,但无法弄清楚如何操作。
-
我尝试了什么:
在选项视图的顶部添加隐形按钮不起作用。然后页面卷起了我不想要的全部方式。
除此之外,我被困住了。我应该如何复制它最初的工作方式(或者我从一开始就以错误的方式进行复制!)。非常感谢任何帮助!
答案 0 :(得分:71)
老兄,我遇到了同样的问题..这里是我发现的使用parentViewController:
请注意,从5.0开始不再这样 将返回呈现视图 控制器。
这是写在UIViewController的头文件中......
我正在使用ShareKit,并且modalViewController在iOS4中完美运行,但在iOS5中,它只是不会解雇自己!这是因为在他们的代码中,他们正在使用:
[[currentView parentViewController] dismissModalViewControllerAnimated:animated];
并且parentViewController将返回nil,因为这是一个模态呈现的视图控制器...
通过搜索解决方案,我找到了你的问题..所以,我决定自己解决这个问题:P
我将上一行更改为:
[currentView dismissModalViewControllerAnimated:YES];
像魅力一样。
编辑:根据您对原始问题的解释方式,有两个答案。这是第二个:
在iOS5中,模态控制器似乎只在您点击卷曲时自动解散,而不是在卷曲或背景上方。在iOS5中,为了在点击背景或卷曲上方时实际获取模态视图以解除自身,我将以下代码添加到控制器,以监听模态视图上的点击,但忽略点击按钮。当使用带有页面卷曲的模态控制器时,这应该模仿iOS早期版本中的行为。
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}
答案 1 :(得分:15)
您用来解雇模态视图控制器的代码是什么?我见过这样的代码:
[self.parentViewController dismissModalViewControllerAnimated: YES];
不适用于所有版本的操作系统。但是,这个:
[self dismissModalViewControllerAnimated: YES];
应。
答案 2 :(得分:1)
我有同样的问题,也影响到使用者:
[self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];
我用Observer修复它,将其添加到你解雇的位置:
[[NSNotificationCenter defaultCenter] postNotificationName:@"yourObserverName" object:self];
这是在父父视图控制器中:
// add in viewDidLoad for example
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dismissModalVCFromParent:) name:@"yourObserverName" object: nil];
//The function
- (void) dismissModalVCFromParent:(NSNotification *)notif
{
[self dismissModalViewControllerAnimated:YES];
}
// Don't forget remove
[[NSNotificationCenter defaultCenter] removeObserver:self];
答案 3 :(得分:0)
这似乎适用于ios 5的(现在最终版本)。
我注意到你必须点击是一个特定的区域来消除页面卷曲 - 在屏幕顶部边缘附近轻敲似乎什么也没做,但是页面上方的模糊部分中心,模糊一致导致解雇模态视图。
我不确定这个狭窄的自来水区域行为对于ios 5来说是新的还是已经存在过,我之前从未注意过。希望这很有帮助!
答案 4 :(得分:0)
谢谢大家,这给我节省了很多时间。我刚才注意到presentModalViewController
和dismissModalViewController
方法已根据UIViewControoler.h
的源代码弃用。还有其他presentViewController
和dismissViewController
方法。
答案 5 :(得分:0)
在iOS5中,模态控制器似乎只在您点击卷曲时自动解散,而不是在卷曲或背景上方。在iOS5中,为了在点击背景或卷曲上方时实际获取模态视图以解除自身,我将以下代码添加到控制器,以监听模态视图上的点击,但忽略点击按钮。当使用带有页面卷曲的模态控制器时,这应该模仿iOS早期版本中的行为。
- (void)viewDidLoad
{
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
tap.numberOfTapsRequired = 1;
tap.numberOfTouchesRequired = 1;
tap.delegate = self;
[backgroundView addGestureRecognizer:tap];
}
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
//change it to your condition
if ([touch.view isKindOfClass:[UIButton class]]) {
return NO;
}
return YES;
}
- (void)handleTap:(UITapGestureRecognizer *)sender {
[self dismissModalViewControllerAnimated:YES];
}