CYLTabBarController 第六篇(Tabbar底部栏)

以下笔记内容仅供个人参考,如有理解错误,请高抬贵手,仙人指路,互相学习进步...

使用方法教程

使用方法及教程,查看项目源码github地址:https://github.com/ChenYilong/CYLTabBarController,非常感谢开源的作者,开源促进社区的发展,共建和谐社会😆!

框架全部文件结构

1.CYLTabBarController
2. CYLTabBar
3.CYLPlusButton
4.UIViewController+CYLTabBarControllerExtention
5.UIView+CYLTabBarControllerExtention
6.UITabBarItem+CYLTabBarControllerExtention
7.UIControl+CYLTabBarControllerExtention
8.CYLConstants
8.总结

解读UITabBarItem+CYLTabBarControllerExtention类文件,在源码中中文注释自己的理解👇

UITabBarItem+CYLTabBarControllerExtention类文件(.h,.m)

解读UITabBarItem+CYLTabBarControllerExtention.h,
UITabBarItem+CYLTabBarControllerExtention.m

可能需要理解的知识点:
.Block代码块//www.greatytc.com/p/14efa33b3562
.类别Category扩展//www.greatytc.com/p/b49e02eb7eb3
.runtime机制https://github.com/Tuccuay/RuntimeSummary
.KVC设计模式//www.greatytc.com/p/45cbd324ea65
.KVO设计模式//www.greatytc.com/p/e59bb8f59302
.异常处理机制//www.greatytc.com/p/f28b9b3f8e44

UITabBarItem+CYLTabBarControllerExtention文件

#import <UIKit/UIKit.h>

@interface UITabBarItem (CYLTabBarControllerExtention)

//添加了一个tabbarButton
@property (nonatomic, readonly) UIControl *cyl_tabButton;

@end
#import "UITabBarItem+CYLTabBarControllerExtention.h"
#import <objc/runtime.h>
#import "UIControl+CYLTabBarControllerExtention.h"

@implementation UITabBarItem (CYLTabBarControllerExtention)

//设置badge值
- (void)cyl_setBadgeValue:(NSString *)badgeValue {
    [self.cyl_tabButton cyl_removeTabBadgePoint];
    [self cyl_setBadgeValue:badgeValue];
}

//获取badge视图
- (UIControl *)cyl_tabButton {
    UIControl *control = [self valueForKey:@"view"];
    return control;
}


//runtime方法交换
+ (void)load {
    [self cyl_swizzleSetBadgeValue];
}

+ (void)cyl_swizzleSetBadgeValue {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        cyl_ClassMethodSwizzle([self class], @selector(setBadgeValue:), @selector(cyl_setBadgeValue:));
    });
}

#pragma mark - private method

BOOL cyl_ClassMethodSwizzle(Class aClass, SEL originalSelector, SEL swizzleSelector) {
    Method originalMethod = class_getInstanceMethod(aClass, originalSelector);
    Method swizzleMethod = class_getInstanceMethod(aClass, swizzleSelector);
    BOOL didAddMethod = class_addMethod(aClass,originalSelector,method_getImplementation(swizzleMethod),method_getTypeEncoding(swizzleMethod));
    if (didAddMethod) {
        class_replaceMethod(aClass,
                            swizzleSelector,
                            method_getImplementation(originalMethod),
                            method_getTypeEncoding(originalMethod));
    } else {
        method_exchangeImplementations(originalMethod, swizzleMethod);
    }
    return YES;
}

@end

UITabbarController总结:

1、自定义了一个UITabBarItem的分类,实现setBadgeValue与cyl_setBadgeValue方法交换

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,397评论 25 709
  • 11月9日将进行期中考试,孩子们经过一个星期大强度的强化训练,对于做试卷已经是轻车熟路了。今天,我们又做了份去...
    chunma阅读 279评论 0 1
  • “也许你身边的人,就是你这一辈子最值得珍惜的财富。”这是电视剧《最好的我们》中的一句话。 我们这一生都要经历许许多...
    隐琉璃阅读 712评论 0 1
  • 很多人,都认为微信不会永久封号, 其一理由QQ就不会永久封号,只会冻结。其二理由便是我的微信里还有RMB,腾讯就能...