我在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上运行。
答案 0 :(得分: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?
对不起,但我没有答案。
答案 1 :(得分:3)
在发布我的解决方案之前的一句话。很容易担心行为的微小变化,并希望立即禁用它。但考虑第一个一致性。这是操作表在整个操作系统中的行为方式。如果您禁用此行为,则会破坏一致性,这将为您的用户带来次级体验。
那就是说,这是我的解决方案。
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];
}
}