5

我注意到iOS 7 a **UIActionSheet** automatically dismissesuser taps anywhere on the screen on an **iPhone**. 这在 iOS 6 中并非如此,并且会导致意想不到的效果。Is this a UI change? Bug? Is there a way to disable this?

来自 iOS 7 文档:
“如 iOS 人机界面指南中所述,您应该包含一个取消按钮,其中包含在 iPhone 上显示的操作表以及在 iPad 上显示在打开的弹出框上的操作表。否则在 iPad 上,操作表显示在弹出框内,并且用户可以通过在弹出框外点击来取消操作表,在这种情况下,您不需要包含取消按钮。”

这似乎表明在操作表之外的任何地方点击时关闭的行为应该只适用于 iPad。但这现在发生在运行 iOS 7 的 iPhone 上,而运行 iOS 6 的 iPhone 上却没有

4

5 回答 5

3

在我发布我的解决方案之前先说一句话​​。很容易担心行为的微小变化并想要立即禁用它。但考虑第一个一致性。这就是操作表在整个操作系统中的行为方式。如果您禁用此行为,您将破坏一致性,这将导致您的用户体验不佳。

也就是说,这是我的解决方案。


UIActionSheet在 iPhone 上,它会在一个单独的UIWindow实例中打开它的视图,该实例在显示时成为关键。您可以使用 访问此窗口[UIApplication sharedApplication].keyWindow。如果您检查此窗口的视图层次结构,您会注意到几个私有类,例如调光视图。您可以递归地遍历此视图层次结构并设置view.userInteractionEnabled = NO;为其中不是UIButton. 这应该可以解决问题。

于 2013-09-19T18:22:37.453 回答
3

正如@nvrtdfrst 在他的评论中暗示的那样,设置cancelButton: nil将摆脱默认的解雇行为。但是您仍然可以通过将自定义按钮之一的文本设置为 -- 以@"Cancel"由委托方法处理来获得取消按钮,如下所示:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
     if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"Cancel"]) {
         // your cancellation code here
     }
}

有点hacky,但这是一个简单的解决方案。

H/T:

于 2013-10-09T13:46:37.417 回答
3

关于你的问题Is this a UI change? Bug?

这似乎是一个UI change not a bug我怎么说呢?
看看我从 iOS7 模拟器拍摄的
图像 这是 iPhone 的地图应用程序的图像。 在此处输入图像描述


当您单击按钮(显示为红色矩形)时,将显示一个操作表,which have Cancel button如下所示
在此处输入图像描述

而且,如果您单击它会关闭的任何其他位置,则在其他 Apple 应用程序(如 safari)中也会发现相同的行为。
关于你的问题Is there a way to disable this?
对不起,但我没有答案。

于 2013-09-18T09:27:34.927 回答
0

利用

- (void)actionSheet:(UIActionSheet *)actionSheet 
didDismissWithButtonIndex:(NSInteger)buttonIndex {...}
于 2013-11-25T07:28:10.250 回答
0

这对我有用。

    (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if (buttonIndex == 0) {
        [self performSegueWithIdentifier:@"firstOption" sender:self];
    }else if (buttonIndex == 1){
        [self performSegueWithIdentifier:@"secondOption" sender:self];
    } else if (buttonIndex != 0 || buttonIndex != 1) {
        [actionSheet cancelButtonIndex];
    }

}
于 2015-03-21T19:04:41.220 回答