模仿UIAlertView,iOS模式对话框
十一 13
Apple技术 BYDialog, iOS, model dialog, UIAlertView, UIViewController, 模仿, 模式对话框, 模拟 7 Comments
在程序UI设计上,很多情况我们会需要一种模式的对话框来进行操作。现有的iOS提供如下方式满足这种需求:
- UIAlertView
- UIViewController : - (void)presentModalViewController:(UIViewController *)modalViewController animated:(BOOL)animated
但是这两者明显都有不足,比如说UIAlertView官方只能显示title,message, buttons. 如果想要显示一个帐号密码输入框就不行)虽然网络上有一些程序员通过hack的方式实现了, http://stackoverflow.com/questions/376104/uitextfield-in-uialertview-on-iphone-how-to-make-it-responsive, 但是现在还是挺费劲的),所以想要随心所欲的在多样化模式对话框的UI界面标准的lib明显不能满足这个需求。于是我就实现了一个可以任意设置界面的模式对话框,叫 BYDialog.在给这个东西命名上,我想找一个好的前缀,但是一直没有更好的想法,所以就自恋地直接用自己的中文名的拼音开头作了前缀。
BYDialog核心思想:
- 新建一个UIWindow,其windowLevel比UIWindowLevelStatusBar大一点,这样就可以让显示的内容完全覆盖status bar了。
- UIWindow背景透明,然后添加一个拥有灰灰背景图片的UIImageView,暂且加maskview。这样原来的内容就会有像UIAlertView一样的淡化效果,突出显示模式对话框的内容。
- 在UIWindow中添加BYDialog(是UIView的subclass),BYDialog并显示bounce动画效果。
这样就能够像UIAlertView一现显示出来了:)
如何自定义BYDialog用户界面:(具体可以参考TestDialog的实现)
- subclass BYDialog, 然后必须改写- (void)loadContentView,并提供你自己想要显示的UI内容,注意这个内容要适当大小,不要超出屏幕大小。
- override - (void)willPresentDialog;- (void)didPresentDialog;- (void)willDismissDialog;- (void)didDismissDialog;并响应这种事件消息。
- 可以为自己的类提供各种delegate函数,根据以上捕捉到的事件消息或者其他地方,触发delegate函数调用。
所以整个UIAlertView 模仿过程完成了,效果如截图:
---------------------------------------------
源代码地址:
Google Code : http://code.google.com/p/bydialog/
---------------------------------------------
如果你觉得这个很cool的话,在下面顶一下吧

一 20, 2011 @ 10:48:50
请问,google code上面代码怎么没有了阿.我也想学习学习这样的做法~
可以发一份给我吗?
谢谢拉~
一 28, 2011 @ 11:46:53
代码在啊,要自己用svncheckout http://code.google.com/p/bydialog/source/checkout
十二 07, 2011 @ 22:22:08
你好,看了你的文章我大受启发,先在这里谢谢您了。我是一名学生,学xcode到现在已经过去将近三周,始终对对话框这个不得要领,看了你的源代码,深受启发,但是如果对话框和view通信怎么做?意思是如果我在对话框中有一些按钮,如何控制主窗口的table view controller的table view显示数据呢?显示数据可以用nsmutablearray存放,但是这个传递过程我想不通,请您赐教,再次感谢。
十二 13, 2011 @ 11:39:52
1. button -> viewcontroller -> tableview
2. button-> dialog -(delegate)> viewcontrller -> tableview
一 11, 2012 @ 13:28:52
这样弹出的对话框虽然大小跟设计的是一致的,但是变模糊了,不知道什么原因?
一 11, 2012 @ 15:32:20
可能是因为frame的CGFloat有小数,用CGRectIntegral转一下就好了。
二 08, 2012 @ 02:42:02
这种弹出的对话框可否用单独建一个xib,然后在UIViewController中调用来实现呢?
一直没有成功。