33

我在做什么:

在我的应用程序中,我使用以下代码呈现模式视图控制器(包含应用程序设置):

    optionsViewController.modalTransitionStyle = UIModalTransitionStylePartialCurl;
    [self presentModalViewController:optionsViewController animated:YES];

这种过渡只是卷曲了视图的底部以显示一些设置。(有关示例,请参阅“地图”应用程序。)当您点击页面的上半部分时,原始视图仍然存在但呈灰色显示,模式视图控制器会自动关闭(由操作系统处理,我没有) t 代码)。

-

什么不起作用:

这在 iOS 4 中运行良好(事实上,我的应用程序目前在 App Store 上)。但在 iOS 5 中,Apple 似乎改变了这种转换的行为,并且视图控制器不再关闭自己。我正在尝试复制操作系统之前处理的行为,但不知道如何去做。

-

我试过的:

在选项视图的顶部添加一个不可见的按钮不起作用。然后页面完全卷曲,这是我不想要的。

除此之外,我被困住了。我应该如何复制它最初的工作方式(或者我从一开始就做错了!)。任何帮助深表感谢!

4

6 回答 6

71

伙计,我遇到了同样的问题..这是我使用 parentViewController 发现的:

请注意,从 5.0 开始,这将不再返回呈现视图控制器。

这是写在 UIViewController 的头文件中的...

我正在使用 ShareKit,modalViewController 在 iOS4 中运行良好,但在 iOS5 中,它不会自行关闭!这是因为在他们的代码中,他们使用:

    [[currentView parentViewController] dismissModalViewControllerAnimated:animated];

并且 parentViewController 将返回 nil,因为这是一个模态呈现的视图控制器......

通过寻找解决方案,我找到了您的问题.. 所以,我决定自己修复它:P

我将上一行更改为:

    [currentView dismissModalViewControllerAnimated:YES];

奇迹般有效。


编辑:根据您如何解释原始问题,有两个答案。这是第二个:

在 iOS5 中,模态控制器似乎只会在您单击 curl 时自行关闭,而不是在 curl 或背景上方。在 iOS5 中,为了让模态视图在点击背景或 curl 上方时自动消失,我将以下代码添加到控制器中,以监听模态视图上的点击,但忽略对按钮的点击。当使用带有页面卷曲的模态控制器时,这应该模仿以前版本的 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];
}
于 2011-07-07T20:45:27.307 回答
15

您用来关闭模态视图控制器的代码是什么?我见过这样的代码:

[self.parentViewController dismissModalViewControllerAnimated: YES];

这不适用于所有版本的操作系统。然而,这:

[self dismissModalViewControllerAnimated: YES];

应该。

于 2011-07-02T18:34:37.700 回答
1

我有同样的问题,也影响那些使用:

 [self.parentViewController.parentViewController dismissModalViewControllerAnimated:YES];

我用观察者修复它,在你被解雇的地方添加这个:

[[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];
于 2011-10-13T12:03:24.290 回答
0

这似乎适用于(现在的最终版本)ios 5。

我注意到您必须点击一个特定区域才能关闭页面卷曲 - 在屏幕顶部边缘附近点击似乎没有任何作用,但页面卷曲图形上方的中心模糊部分始终会导致关闭模态视图。

我不确定这种狭窄的点击区域行为对于 ios 5 来说是新的还是已经存在并且我以前从未注意到过。希望这会有所帮助!

于 2011-10-13T03:15:43.023 回答
0

谢谢大家,这为我节省了很多时间。我刚刚注意到presentModalViewControlleranddismissModalViewController方法根据UIViewControoler.h. 有替代方法presentViewControllerdismissViewController方法。

于 2011-10-22T17:13:11.913 回答
0

在 iOS5 中,模态控制器似乎只会在您单击 curl 时自行关闭,而不是在 curl 或背景上方。在 iOS5 中,为了让模态视图在点击背景或 curl 上方时自动消失,我将以下代码添加到控制器中,以监听模态视图上的点击,但忽略对按钮的点击。当使用带有页面卷曲的模态控制器时,这应该模仿以前版本的 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];
}
于 2011-11-01T00:36:37.387 回答