iOS7中的UIActionSheet在用户点击iPhone屏幕上的ANYWHERE时消失

时间:2013-09-12 22:52:09

标签: objective-c cocoa uiactionsheet ios7

我在iOS 7 a **UIActionSheet** automatically dismisses user taps anywhere on the screen on an **iPhone**时注意到了Is this a UI change? Bug? Is there a way to disable this?。这不是iOS 6中的情况,并且导致意想不到的效果。的 {{1}}

  

From iOS 7 docs:
“如iOS人机界面所述   准则,您应该包括带有操作表的“取消”按钮   显示在iPhone上,以及在iPad上显示的那些   酥料饼。否则,在iPad上,操作表会显示在   popover,用户可以通过点击外部来取消操作表   弹出窗口,在这种情况下,您不需要包含取消   键“。

这似乎表明,在操作表单之外的任何地方点击时解雇的行为应仅适用于iPad。但现在这种情况发生在运行iOS 7的iPhone上,而不是在运行iOS 6的iPhone上运行。

5 个答案:

答案 0 :(得分:3)

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

好像是UI change not a bug我该怎么说?
看看我从iOS7模拟器拍摄的图像
这是iPhone的地图应用程序的图像。 enter image description here


当您点击按钮(显示在红色矩形中)时,一个操作表将显示which have Cancel button,如下所示 enter image description here

如果你点击其他任何它将关闭的地方,在其他Apple应用程序中也会发现同样的行为,如safari。
关于你的问题Is there a way to disable this?
对不起,但我没有答案。

答案 1 :(得分:3)

在发布我的解决方案之前的一句话。很容易担心行为的微小变化,并希望立即禁用它。但考虑第一个一致性。这是操作表在整个操作系统中的行为方式。如果您禁用此行为,则会破坏一致性,这将为您的用户带来次级体验。

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


iPhone上的

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

答案 2 :(得分: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:null

答案 3 :(得分:0)

使用

- (void)actionSheet:(UIActionSheet *)actionSheet 
didDismissWithButtonIndex:(NSInteger)buttonIndex {...}

答案 4 :(得分: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];
    }

}