iOS浅谈如何设计第三方框架

作者: 船长_ | 来源:发表于2016-01-02 02:00 被阅读1150次

    如何设计一个好的第三方框架给别其他开发者用?需要要考虑哪些方面?

    • 如图:一个简易的状态栏的hud示例,通过这个示例了解在设计第三方框架需要注意哪些方面
    demo.gif

    一.框架的名字

    • DXStatusBarHUD,前缀自定义,比如自己的名字缩写,StatusBarHUD名字中要能显示出框架的功能

    二.设计对外的接口

    • 首先考虑外界如何调用方便
    • 其次要考虑性能最好,优先考虑类方法,如--> 类名 + 方法

    1.外界调用的方法

    - (IBAction)success {
        [DXStatusBarHUD showSuccess:@"加载数据成功!"];
    }
    
    - (IBAction)error {
        [DXStatusBarHUD showError:@"登录失败!"];
    }
    
    - (IBAction)loading {
        [DXStatusBarHUD showLoading:@"正在登录中..."];
    }
    
    - (IBAction)hide {
        [DXStatusBarHUD hide];
    }
    
    - (IBAction)normal {
        [DXStatusBarHUD showText:@"随便显示的文字!!!!"];
    }
    

    2.对外提供的方法

    • 注意:
    • 尽量用文档注释,这样书写有提示
    • 用户不传图片,默认提供图片
    • 要考虑到外界更改提示框图片的情况
    • 注意对外提供的接口和参数应该尽量少
    • 要考虑到用户不停的点击或者乱点击等各种情况,需多作判断
    /*此方法设计缺点:只能加载本地图片,不能加载网络图片,例如用SD_webImage下载保存到沙盒的图片
     * 显示图片+文字信息
     */
    + (void)showImageName:(NSString *)imageName text:(NSString *)text;
    
    /**
     * 显示图片+文字信息
     */
    + (void)showImage:(UIImage *)image text:(NSString *)text;
    
    /**
     * 显示成功信息
     */
    + (void)showSuccess:(NSString *)text;
    
    /**
     * 显示失败信息
     */
    + (void)showError:(NSString *)text;
    
    /**
     * 显示正在处理的信息
     */
    + (void)showLoading:(NSString *)text;
    
    /**
     * 显示普通信息
     */
    + (void)showText:(NSString *)text;
    
    /**
     * 隐藏
     */
    + (void)hide;
    

    3.方法的实现

    • 注意:
      • 在类方法中不能调用对象的属性,如果想要保住一个对象的命,可以用全局变量;
      • 一些常量推荐使用static修饰的全局常量,而不使用宏
      • 注释要简明扼要,减少不必要的注释
      • 注意代码的封装,重构
      • 注意代码的可扩展性,方便其他开发者可以给这个框架添加新功能
      • 注意定时器的使用,不用的时候要清空
    static UIWindow *window_;
    static NSTimer *timer_;
    /** HUD控件的高度 */
    static CGFloat const DXWindowH = 20;
    /** HUD控件的动画持续时间(出现\隐藏) */
    static CGFloat const DXAnimationDuration = 0.25;
    /** HUD控件默认会停留多长时间 */
    static CGFloat const DXHUDStayDuration = 1.5;
    
    + (void)showImage:(UIImage *)image text:(NSString *)text
    {
        // 停止之前的定时器
        [timer_ invalidate];
        
        // 创建窗口
        window_.hidden = YES; // 先隐藏之前的window
        window_ = [[UIWindow alloc] init];
        window_.backgroundColor = [UIColor blackColor];
        window_.windowLevel = UIWindowLevelAlert;
        window_.frame = CGRectMake(0, - DXWindowH, [UIScreen mainScreen].bounds.size.width, DXWindowH);
        window_.hidden = NO;
        
        // 添加按钮
        UIButton *button = [[UIButton alloc] init];
        button.frame = window_.bounds;
        // 文字
        [button setTitle:text forState:UIControlStateNormal];
        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        button.titleLabel.font = [UIFont systemFontOfSize:13];
        // 图片
        if (image) {
            [button setImage:image forState:UIControlStateNormal];
            button.imageEdgeInsets = UIEdgeInsetsMake(0, 0, 0, 5);
            button.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
        }
        [window_ addSubview:button];
        
        // 动画
        [UIView animateWithDuration:DXAnimationDuration animations:^{
            CGRect frame = window_.frame;
            frame.origin.y = 0;
            window_.frame = frame;
        }];
        
        // 开启一个新的定时器
        timer_ = [NSTimer scheduledTimerWithTimeInterval:DXHUDStayDuration target:self selector:@selector(hide) userInfo:nil repeats:NO];
    }
    
    + (void)showImageName:(NSString *)imageName text:(NSString *)text
    {
        [self showImage:[UIImage imageNamed:imageName] text:text];
    }
    
    + (void)showSuccess:(NSString *)text
    {
        [self showImageName:@"DXStatusBarHUD.bundle/success" text:text];
    }
    
    + (void)showError:(NSString *)text
    {
        [self showImageName:@"DXStatusBarHUD.bundle/error" text:text];
    }
    
    + (void)showText:(NSString *)text
    {
        [self showImage:nil text:text];
    }
    
    + (void)showLoading:(NSString *)text
    {
        // 停止之前的定时器
        [timer_ invalidate];
        timer_ = nil;
        
        // 创建窗口
        window_.hidden = YES; // 先隐藏之前的window
        window_ = [[UIWindow alloc] init];
        window_.backgroundColor = [UIColor blackColor];
        window_.windowLevel = UIWindowLevelAlert;
        window_.frame = CGRectMake(0, - DXWindowH, [UIScreen mainScreen].bounds.size.width, DXWindowH);
        window_.hidden = NO;
        
        // 添加按钮
        UIButton *button = [[UIButton alloc] init];
        button.frame = window_.bounds;
        // 文字
        [button setTitle:text forState:UIControlStateNormal];
        [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        button.titleLabel.font = [UIFont systemFontOfSize:13];
        [window_ addSubview:button];
        
        // 圈圈
        UIActivityIndicatorView *loadingView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
        [loadingView startAnimating];
        loadingView.center = CGPointMake(button.titleLabel.frame.origin.x - 60, DXWindowH * 0.5);
        [window_ addSubview:loadingView];
        
        // 动画
        [UIView animateWithDuration:DXAnimationDuration animations:^{
            CGRect frame = window_.frame;
            frame.origin.y = 0;
            window_.frame = frame;
        }];
    }
    
    + (void)hide
    {
        // 清空定时器
        [timer_ invalidate];
        timer_ = nil;
        
        // 退出动画
        [UIView animateWithDuration:DXAnimationDuration animations:^{
            CGRect frame = window_.frame;
            frame.origin.y =  - DXWindowH;
            window_.frame = frame;
        } completion:^(BOOL finished) {
            window_ = nil;
        }];
    }
    

    三.关于图片资源处理

    • 对应图片资源,应该注意框架内部图片名称不能出现与使用者图片名称一样,为解决可能出现图片名称一样,可以对图片文件夹打包成bundle文件,如图
    pic.png

    四.简单易用

    • 要减少开发者的项目的侵入性,比如不需要开发者的类继承框架内部的类
    • 提供一个demo供开发者快速上手
    • 开发者使用:
      1.把框架文件拽入自己项目中
      2.导入头文件
      3.查看头文件的方法,直接调用

    相关文章

      网友评论

      • 匿名的他:写的很清晰 对我这入门级别的帮助特别大:+1::+1:
      • 火星的蝈蝈:谢谢作者,写的很好,初学者也可以完全看明白

      本文标题:iOS浅谈如何设计第三方框架

      本文链接:https://www.haomeiwen.com/subject/ufjwhttx.html