开源项目:MMPopupView

作者:里脊串 授权本站转载。

前言

弹出框组件应该是绝大多数应用都少不了的(只有极少数精心设计的APP会用不到) 当然我们的APP也不例外 之前我们APP的弹出框组件是我用pop写的 可是后来发现与系统原生动画有些冲突(pop内部用到了CATransaction 导致跟系统动画同时发生时会有问题) 所以上周花了大半天时间重写了一下MMPopupView这个组件

因为新写的组件完全是用Masonry写的 我觉得是个非常好的示例教程 结合之前我写的Masonry入门教程 应该可以更好的理解和运用Masonry/Autolayout 所以我又花了一点时间重新整理成了一个简单的开源库 有兴趣的朋友可以研究一下

运行的demo可以在这里查看

介绍

整体的组成大概就是这个样子

MMPopupWindow就是用来显示所有弹出框的容器 相对直接显示在当前UIWindow上来说 弄个独立的Window出来当容器的会更好

MMPopupView就是弹出框的基类 所有的弹出框只要继承自这个类 就具备了显示的能力 用户只要关注于弹出框本身的表现就行了

MMAlertView和MMSheetView都是我提供的基于MMPopupView的简单组件 可以直接拿来用 而且都是高度可定制的(这个稍后会介绍)      

MMPopupWindow

MMPopupWindow的定义如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@interface MMPopupWindow : UIWindow

@property (nonatomic, assign) BOOL touchWildToHide; // default is NO. When YES, popup views will be hidden when user touch the translucent background.

+ (MMPopupWindow *)sharedWindow;

/**

*  cache the window to prevent the lag of the first showing.

*/

- (void) cacheWindow;

/**

*  show the translucent background

*/

- (void) showDimBackground;

/**

*  hide the translucent background

*/

- (void) hideDimBackground;

@end

很简单 只有一个属性touchWildToHide用来控制是否可以点击非弹出框的地方来使弹出框消失 还有一个cacheWindow的方法来预加载MMPopupWindow 防止第一次使用的时候顿卡

另外还有两个用于显示和隐藏背景色的方法 这个在自定义动画的时候会用到


1

2

3

- (void) showDimBackground;

- (void) hideDimBackground;

     

MMPopupView

MMPopupView的定义如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

typedef NS_ENUM(NSUInteger, MMPopupType) {

MMPopupTypeAlert,

MMPopupTypeSheet,

MMPopupTypeCustom,

};

@class MMPopupView;

typedef void(^MMPopupBlock)(MMPopupView *);

@interface MMPopupView : UIView

@property (nonatomic, assign) MMPopupType    type;                  // default is MMPopupTypeAlert.

@property (nonatomic, assign) NSTimeInterval animationDuration;     // default is 0.3 sec.

@property (nonatomic, assign) BOOL           withKeyboard;          // default is NO. When YES, alert view with be shown with a center offset (only effect with MMPopupTypeAlert).

@property (nonatomic, copy  ) MMPopupBlock   showCompletionBlock;   // show completion block.

@property (nonatomic, copy  ) MMPopupBlock   hideCompletionBlock;   // hide completion block

@property (nonatomic, copy  ) MMPopupBlock   showAnimation;         // custom show animation block (only effect with MMPopupTypeCustom).

@property (nonatomic, copy  ) MMPopupBlock   hideAnimation;         // custom hide animation block (only effect with MMPopupTypeCustom).

/**

*  override this method to show the keyboard if with a keyboard

*/

- (void) showKeyboard;

/**

*  override this method to hide the keyboard if with a keyboard

*/

- (void) hideKeyboard;

/**

*  show the popup view

*/

- (void) show;

/**

*  show the popup view with completiom block

*

*  @param block show completion block

*/

- (void) showWithBlock:(MMPopupBlock)block;

/**

*  hide the popup view

*/

- (void) hide;

/**

*  hide the popup view with completiom block

*

*  @param block hide completion block

*/

- (void) hideWithBlock:(MMPopupBlock)block;

@end

使用起来很简单 定义好自己的view 然后调用下面的方法就好了


1

2

- (void) show;

- (void) hide;

默认提供了三种类型 对应三种动画效果


1

2

3

4

5

typedef NS_ENUM(NSUInteger, MMPopupType) {

MMPopupTypeAlert,   //中间隐出

MMPopupTypeSheet,   //向上滑出

MMPopupTypeCustom,  //向下掉落

};

当然你也可以自己定义想要的动画效果 只要重载下面两个block就行了


1

2

@property (nonatomic, copy) MMPopupBlock   showAnimation;

@property (nonatomic, copy) MMPopupBlock   hideAnimation;

同时提供了动画的回调 可以直接指定block或者直接调用方法


1

2

3

4

5

@property (nonatomic, copy  ) MMPopupBlock   showCompletionBlock;

@property (nonatomic, copy  ) MMPopupBlock   hideCompletionBlock;

- (void) showWithBlock:(MMPopupBlock)block;

- (void) hideWithBlock:(MMPopupBlock)block;

     

MMAlertView

MMAlertView就是UIAlertView的替代品 接口如下


1

2

3

4

5

6

7

8

9

10

11

12

13

typedef void(^MMPopupInputHandler)(NSString *text);

@interface MMAlertView : MMPopupView

@property (nonatomic, assign) NSUInteger maxInputLength;    // default is 0. Means no length limit.

- (instancetype) initWithInputTitle:(NSString*)title

detail:(NSString*)detail

placeholder:(NSString*)inputPlaceholder

handler:(MMPopupInputHandler)inputHandler;

- (instancetype) initWithConfirmTitle:(NSString*)title

detail:(NSString*)detail;

- (instancetype) initWithTitle:(NSString*)title

detail:(NSString*)detail

items:(NSArray*)items;

@end

分别对应下面三种形式

同时提供一个全局的配置类 可以充分的自定义


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

@interface MMAlertViewConfig : NSObject

+ (MMAlertViewConfig*) globalConfig;

@property (nonatomic, assign) CGFloat width;                // Default is 275.

@property (nonatomic, assign) CGFloat buttonHeight;         // Default is 50.

@property (nonatomic, assign) CGFloat innerMargin;          // Default is 25.

@property (nonatomic, assign) CGFloat cornerRadius;         // Default is 5.

@property (nonatomic, assign) CGFloat titleFontSize;        // Default is 18.

@property (nonatomic, assign) CGFloat detailFontSize;       // Default is 14.

@property (nonatomic, assign) CGFloat buttonFontSize;       // Default is 17.

@property (nonatomic, strong) UIColor *backgroundColor;     // Default is #FFFFFF.

@property (nonatomic, strong) UIColor *titleColor;          // Default is #333333.

@property (nonatomic, strong) UIColor *detailColor;         // Default is #333333.

@property (nonatomic, strong) UIColor *splitColor;          // Default is #CCCCCC.

@property (nonatomic, strong) UIColor *itemNormalColor;     // Default is #333333. effect with MMItemTypeNormal

@property (nonatomic, strong) UIColor *itemHighlightColor;  // Default is #E76153. effect with MMItemTypeHighlight

@property (nonatomic, strong) UIColor *itemPressedColor;    // Default is #EFEDE7.

@property (nonatomic, strong) NSString *defaultTextOK;      // Default is "好".

@property (nonatomic, strong) NSString *defaultTextCancel;  // Default is "取消".

@property (nonatomic, strong) NSString *defaultTextConfirm; // Default is "确定".

@end

     

MMAlertView

MMAlertView就是UIAlertView的替代品 接口如下


1

2

3

4

@interface MMSheetView : MMPopupView

- (instancetype) initWithTitle:(NSString*)title

items:(NSArray*)items;

@end

呈现如下

同时提供一个全局的配置类 可以充分的自定义


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

@interface MMSheetViewConfig : NSObject

+ (MMSheetViewConfig*) globalConfig;

@property (nonatomic, assign) CGFloat buttonHeight;         // Default is 50.

@property (nonatomic, assign) CGFloat innerMargin;          // Default is 19.

@property (nonatomic, assign) CGFloat titleFontSize;        // Default is 14.

@property (nonatomic, assign) CGFloat buttonFontSize;       // Default is 17.

@property (nonatomic, strong) UIColor *backgroundColor;     // Default is #FFFFFF.

@property (nonatomic, strong) UIColor *titleColor;          // Default is #666666.

@property (nonatomic, strong) UIColor *splitColor;          // Default is #CCCCCC.

@property (nonatomic, strong) UIColor *itemNormalColor;     // Default is #333333. effect with MMItemTypeNormal

@property (nonatomic, strong) UIColor *itemDisableColor;    // Default is #CCCCCC. effect with MMItemTypeDisabled

@property (nonatomic, strong) UIColor *itemHighlightColor;  // Default is #E76153. effect with MMItemTypeHighlight

@property (nonatomic, strong) UIColor *itemPressedColor;    // Default is #EFEDE7.

@property (nonatomic, strong) NSString *defaultTextCancel;  // Default is "取消"

@end

     

MMPopupItem

MMPopupItem是用于MMAlertView和MMSheetView的动作对象(对应按钮) 定义如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

typedef void(^MMPopupItemHandler)(NSInteger index);

@interface MMPopupItem : NSObject

@property (nonatomic, assign) BOOL     highlight;

@property (nonatomic, assign) BOOL     disabled;

@property (nonatomic, strong) NSString *title;

@property (nonatomic, strong) UIColor  *color;

@property (nonatomic, copy)   MMPopupItemHandler handler;

@end

typedef NS_ENUM(NSUInteger, MMItemType) {

MMItemTypeNormal,

MMItemTypeHighlight,

MMItemTypeDisabled

};

NS_INLINE MMPopupItem* MMItemMake(NSString* title, MMItemType type, MMPopupItemHandler handler)

{

MMPopupItem *item = [MMPopupItem new];

item.title = title;

item.handler = handler;

switch (type)

{

case MMItemTypeNormal:

{

break;

}

case MMItemTypeHighlight:

{

item.highlight = YES;

break;

}

case MMItemTypeDisabled:

{

item.disabled = YES;

break;

}

default:

break;

}

return item;

}

使用方式如下


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

//MMAlertView

NSArray *items =

@[MMItemMake(@"Done", MMItemTypeNormal, block),

MMItemMake(@"Save", MMItemTypeHighlight, block),

MMItemMake(@"Cancel", MMItemTypeNormal, block)];

[[[MMAlertView alloc] initWithTitle:@"AlertView"

detail:@"each button take one row if there are more than 2 items"

items:items]

showWithBlock:completeBlock];

//MMSheetView

NSArray *items =

@[MMItemMake(@"Normal", MMItemTypeNormal, block),

MMItemMake(@"Highlight", MMItemTypeHighlight, block),

MMItemMake(@"Disabled", MMItemTypeDisabled, block)];

[[[MMSheetView alloc] initWithTitle:@"SheetView"

items:items] showWithBlock:completeBlock];

自定义

除了使用MMAlertView和MMSheetView之外 比如我们的应用中会用到输入验证码的提示框和日期的选择框 都可以用MMPopupView来轻松实现

小结

源码和Demo请点这里

更多的细节欢迎运行demo 或者查看源代码 有任何问题欢迎提出来大家一起讨论研究 :)

时间: 2024-11-05 21:58:33

开源项目:MMPopupView的相关文章

自己总结的 iOS ,Mac 开源项目以及库,知识点------持续更新

自己在 git  上看到一个非常好的总结的东西,但是呢, fork  了几次,就是 fork  不到我的 git 上,干脆复制进去,但是,也是认真去每一个每一个去认真看了,并且也是补充了一些,感觉非常棒,所以好东西要分享,为啥用 CN 博客,有个好处,可以随时修改,可以持续更新,不用每次都要再发表,感觉这样棒棒的 我们 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.

Github上关于iOS的各种开源项目集合(强烈建议大家收藏,查看,总有一款你需要)

下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl - XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHouseR

github上关于iOS的各种开源项目集合(转)

UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.具体使用看“使用方法”. (国人写) XHRefreshControl - XHRefreshControl 是一款高扩展性.低耦合度的下拉刷新.上提加载更多的组件.(国人写) CBStoreHou

开源项目使用经验原则

软件开发领域有一个流行的原则:DRY,Don't repeat yourself,我们翻译过来更形象通俗:不要重复造轮子.开源项目主要目的是共享,其实就是为了让大家不要重复造轮子,尤其是在互联网这样一个快速发展的领域,速度就是生命,引入开源项目,可以节省大量的人力和时间,大大加快业务的发展速度,何乐而不为呢? 然而现实往往没有那么美好,开源项目虽然节省了大量的人力和时间,但带来的问题也不少,相信绝大部分同学都踩过开源软件的坑,小的影响可能是宕机半小时,大的问题可能是丢失几十万数据,甚至灾难性的事

优秀的 Android 开源项目

摘要  转载http://www.trinea.cn/android/android-open-source-projects-view/,方便大家找到自己合适的资料 目录[-] 一.ListView 二.ActionBar 三.Menu 四.ViewPager .Gallery 五.GridView 六.ImageView 七.ProgressBar 八.其他 GitHub上优秀Android开源项目 3. Android开发神器 1.Xabber客户端 2.oschina客户端 3.手机安全

【Android开发经验】移动设备的“声波通信/验证”的实现——SinVoice开源项目介绍(一)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在APP市场上,经常有一些充满新意的应用让我们眼前一亮,比如微信的面对面加好友,支付宝的声波支付等等,都是通过声波的方式进行握手通信,今天这篇文章将介绍声波通信和声波验证的实现原理和代码实现. 首先介绍一下声波验证的原理.如果我们想发出声音,就必须震动,说话是声带在震动,手机能播放音乐是喇叭在震动.既然发出声音必须震动,那么就有震动快慢之分,我们把震动的快慢叫做声音的频率.频率低的声音低沉有力,能传播很远

Vue常用经典开源项目汇总参考-海量

Vue常用经典开源项目汇总参考-海量 Vue是什么? Vue.js(读音 /vju/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vue 完全有能力驱动采用单文件组件和 Vue 生态系统支持的库开发的复杂单页应用. Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 易用(已经会了HTML,CSS,J

第一个Android TV Launcher开源项目

Android TV Launcher开源项目 这个项目是机顶盒桌面,用来播放视频.显示图片.应用管理和其他针对机顶盒产品的设置.目前git和CSDN code上面都没有类似的开源项目,正好本人最近在开发类似产品,网上类似研究还非常少,完全自己实现还是比较困难.所以就把目前的项目开源出来,也有利于其他人少走弯路. git项目地址 CSDN code项目地址 项目框架结构 UI.adapter.实体类.图片cache.网络层. 这个层级关系还是和大部分项目是类似的. 功能模块的详细实现方式 这个部

JAVA 版本微信公众账号开源项目招募新成员

大家好: jeecg开源社区,目前正在开展"JAVA 版本微信公众账号开源项目"的开发工作,欢迎有兴趣的朋友一起参与! 截止时间:20140510 详细联系方式:445654970 要求: 1.熟悉jeecg技术平台: 2.有足够的业余时间参与: 官方网站:http://www.jeecg.org/ JAVA 版本微信公众账号开源项目招募新成员,布布扣,bubuko.com