自定义UIAlertView

9

有人有代码可以做到这一点:

UIAlertViewHack
(来源:booleanmagic.com)

或者更好的是,使用UIAlertView对象创建一个包含图像的3x2按钮网格?

我不关心文本字段,我想要的是一个按钮网格(最好带有图像而不是文本)。

5个回答

27

我认为最好的方法是放弃自定义UIAlert视图并自己构建自定义视图。

首先,您展示的内容并不是真正的“警报”,因此与UIAlertView设计的目的背道而驰。这意味着您正在改变用户的UI范例,这从来不是一个好主意。

其次,将自定义视图动画到位比尝试黑客攻击UIAlertView以实现您想要的功能要容易得多。


3
尝试自定义UIAlertView往往会导致苹果拒绝您的应用程序,这不仅如此。 - Chris R. Donnelly

11

首先,您需要将警告框变得更大以容纳您的控件,但它必须放置在中心位置。

为此,您可以使用换行符“\n”来设置消息文本大小,而不是设置框架大小。例如:

alert = [[UIAlertView alloc] initWithTitle:@"Rate this picture."
message:@"Tap a star to rate.\n\n\n\n " /*------ look at here!!----*/
delegate:self
cancelButtonTitle:nil
otherButtonTitles:nil];
然后使用UIAlertViewDelegate处理警告视图。重写其viewWillAppear:方法,在期望的位置手动添加按钮并设置它们的框架。或者,创建一个完整的视图和视图控制器,并将视图添加到警告框中,如下所示:
[myalertview addSubvew:mycomplexalert];

希望这对您有所帮助 :)

我正在使用警告框来进行评级输入,其中包括星形图像、Twitter、FB反馈等。

更新iOS7:

对于iOS 7,请创建自己的视图并将其设置为警报视图的配件视图:

[alert setValue:imageView forKey:@"accessoryView"]; 

这很简单 :-)


1
“\n\n\n\n”这个技巧似乎在当前的iOS 7测试版1中无法使用!我不确定在最终版本的iOS 7中是否会改变。 - Raphael
在iOS 7中,创建自己的视图并将其设置为警报视图的附加视图: [alert setValue:imageView forKey:@"accessoryView"]; - Shaikh Sonny Aman
我认为“accessoryView”不可公开访问可能有原因。因此,这可能会在未来版本中出现问题或被苹果拒绝。 - Raphael
对的,可能它仍然不稳定,但他们在WWDC 2013上演示了(忘记是哪个视频),所以他们可能不会拒绝。在iOS8 beta上,它不起作用 - 即使在带有附件视图的系统警报中也是如此 :/ - Shaikh Sonny Aman

6

这篇教程介绍了如何通过子类化UIAlertView来实现输入文本框。它解释了如何扩大视图,添加子视图(如文本框或图像)并进行变换以将框向上移动到屏幕上方。


这并不涉及如何更改视图的大小,但它有助于展示如何添加文本框并使用其中输入的内容。 - sasquatch

6
我写了一个几乎像素完美的UIAlertView替代品,它还是完全可配置的。如果符合您的需求,请查看CODialog

太好了,@Erik Aigner。然而我刚拿到一个旧的(iOS6)项目,它使用了你的库,我们需要将其迁移到iOS7。你的库使用了iOS6的外观/感觉。你有什么想法如何升级它的外观/感觉,使其看起来像iOS 7吗? - abbood
@abbood 只需覆盖绘图方法即可。 - user187676
哎呀,那是好多行代码啊...你知道苹果是否会接受一个使用你的库的应用程序吗?因为他们只接受针对iOS 7编译的代码。 - abbood

4

对于这个问题,没有内置的组件。根据HIG文档,UIAlertView应该只有文本和按钮。

您需要创建自己的视图并添加控件。SDK中的HeadsUpUI示例展示了如何显示自定义菜单样式的视图作为覆盖层。

希望能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接