模仿UIAlertView,iOS模式对话框

7 Comments

在程序UI设计上,很多情况我们会需要一种模式的对话框来进行操作。现有的iOS提供如下方式满足这种需求:

  1. UIAlertView
  2. 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核心思想:

  1. 新建一个UIWindow,其windowLevel比UIWindowLevelStatusBar大一点,这样就可以让显示的内容完全覆盖status bar了。
  2. UIWindow背景透明,然后添加一个拥有灰灰背景图片的UIImageView,暂且加maskview。这样原来的内容就会有像UIAlertView一样的淡化效果,突出显示模式对话框的内容。
  3. 在UIWindow中添加BYDialog(是UIView的subclass),BYDialog并显示bounce动画效果。

这样就能够像UIAlertView一现显示出来了:)

如何自定义BYDialog用户界面:(具体可以参考TestDialog的实现)

  1. subclass BYDialog, 然后必须改写- (void)loadContentView,并提供你自己想要显示的UI内容,注意这个内容要适当大小,不要超出屏幕大小。
  2. override - (void)willPresentDialog;- (void)didPresentDialog;- (void)willDismissDialog;- (void)didDismissDialog;并响应这种事件消息。
  3. 可以为自己的类提供各种delegate函数,根据以上捕捉到的事件消息或者其他地方,触发delegate函数调用。

所以整个UIAlertView 模仿过程完成了,效果如截图:

---------------------------------------------

源代码地址:

Google Code : http://code.google.com/p/bydialog/

---------------------------------------------

如果你觉得这个很cool的话,在下面顶一下吧 ;)

7 Comments (+add yours?)

  1. Saturday
    一 20, 2011 @ 10:48:50

    请问,google code上面代码怎么没有了阿.我也想学习学习这样的做法~
    可以发一份给我吗?
    谢谢拉~

    回复

  2. vagase
    一 28, 2011 @ 11:46:53

    代码在啊,要自己用svncheckout http://code.google.com/p/bydialog/source/checkout

    回复

  3. 小阳
    十二 07, 2011 @ 22:22:08

    你好,看了你的文章我大受启发,先在这里谢谢您了。我是一名学生,学xcode到现在已经过去将近三周,始终对对话框这个不得要领,看了你的源代码,深受启发,但是如果对话框和view通信怎么做?意思是如果我在对话框中有一些按钮,如何控制主窗口的table view controller的table view显示数据呢?显示数据可以用nsmutablearray存放,但是这个传递过程我想不通,请您赐教,再次感谢。

    回复

    • Near
      十二 13, 2011 @ 11:39:52

      1. button -> viewcontroller -> tableview
      2. button-> dialog -(delegate)> viewcontrller -> tableview

  4. 文祥
    一 11, 2012 @ 13:28:52

    这样弹出的对话框虽然大小跟设计的是一致的,但是变模糊了,不知道什么原因?

    回复

    • Near
      一 11, 2012 @ 15:32:20

      可能是因为frame的CGFloat有小数,用CGRectIntegral转一下就好了。

  5. Near
    二 08, 2012 @ 02:42:02

    这种弹出的对话框可否用单独建一个xib,然后在UIViewController中调用来实现呢?

    一直没有成功。

    回复

Leave a Reply

使用新浪微博登录
  • RSS
  • Twitter
  • Buzz
  • LinkedIn
  • Flickr