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.总结
解读UIControl+CYLTabBarControllerExtention类文件,在源码中中文注释自己的理解👇
UIControl+CYLTabBarControllerExtention类文件(.h,.m)
解读UIControl+CYLTabBarControllerExtention.h,
UIControl+CYLTabBarControllerExtention.m
可能需要理解的知识点:
.Block代码块 【 http://www.jianshu.com/p/14efa33b3562】
.类别Category扩展 【http://www.jianshu.com/p/b49e02eb7eb3】
.runtime机制 【 https://github.com/Tuccuay/RuntimeSummary】
.KVC设计模式 【 http://www.jianshu.com/p/45cbd324ea65】
.KVO设计模式 【 http://www.jianshu.com/p/e59bb8f59302】
.异常处理机制 【http://www.jianshu.com/p/f28b9b3f8e44】
UIControl+CYLTabBarControllerExtention文件
#import <UIKit/UIKit.h>
@interface UIControl (CYLTabBarControllerExtention)
- (UIView *)cyl_tabBadgeView;
- (UIImageView *)cyl_tabImageView;
- (UILabel *)cyl_tabLabel;
/*!
* 调用该方法前已经添加了系统的角标,调用该方法后,系统的角标并未被移除,只是被隐藏,调用 `-cyl_removeTabBadgePoint` 后会重新展示。
*/
- (void)cyl_showTabBadgePoint;
- (void)cyl_removeTabBadgePoint;
- (BOOL)cyl_isShowTabBadgePoint;
@property (nonatomic, strong, setter=cyl_setTabBadgePointView:, getter=cyl_tabBadgePointView) UIView *cyl_tabBadgePointView;
@property (nonatomic, assign, setter=cyl_setTabBadgePointViewOffset:, getter=cyl_tabBadgePointViewOffset) UIOffset cyl_tabBadgePointViewOffset;
@end
#import "UIControl+CYLTabBarControllerExtention.h"
#import <objc/runtime.h>
#import "UIView+CYLTabBarControllerExtention.h"
@implementation UIControl (CYLTabBarControllerExtention)
- (void)cyl_showTabBadgePoint {
[self cyl_setShowTabBadgePointIfNeeded:YES];
}
- (void)cyl_removeTabBadgePoint {
[self cyl_setShowTabBadgePointIfNeeded:NO];
}
- (BOOL)cyl_isShowTabBadgePoint {
return !self.cyl_tabBadgePointView.hidden;
}
- (void)cyl_setShowTabBadgePointIfNeeded:(BOOL)showTabBadgePoint {
@try {
[self cyl_setShowTabBadgePoint:showTabBadgePoint];
} @catch (NSException *exception) {
NSLog(@"CYLPlusChildViewController do not support set TabBarItem red point");
}
}
- (void)cyl_setShowTabBadgePoint:(BOOL)showTabBadgePoint {
if (showTabBadgePoint && self.cyl_tabBadgePointView.superview == nil) {
[self addSubview:self.cyl_tabBadgePointView];
[self bringSubviewToFront:self.cyl_tabBadgePointView];
self.cyl_tabBadgePointView.layer.zPosition = MAXFLOAT;
// X constraint
[self addConstraint:
[NSLayoutConstraint constraintWithItem:self.cyl_tabBadgePointView
attribute:NSLayoutAttributeCenterX
relatedBy:0
toItem:self.cyl_tabImageView
attribute:NSLayoutAttributeRight
multiplier:1
constant:self.cyl_tabBadgePointViewOffset.horizontal]];
//Y constraint
[self addConstraint:
[NSLayoutConstraint constraintWithItem:self.cyl_tabBadgePointView
attribute:NSLayoutAttributeCenterY
relatedBy:0
toItem:self.cyl_tabImageView
attribute:NSLayoutAttributeTop
multiplier:1
constant:self.cyl_tabBadgePointViewOffset.vertical]];
}
self.cyl_tabBadgePointView.hidden = showTabBadgePoint == NO;
self.cyl_tabBadgeView.hidden = showTabBadgePoint == YES;
}
- (void)cyl_setTabBadgePointView:(UIView *)tabBadgePointView {
if (tabBadgePointView.superview) {
[tabBadgePointView removeFromSuperview];
}
tabBadgePointView.hidden = YES;
objc_setAssociatedObject(self, @selector(cyl_tabBadgePointView), tabBadgePointView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIView *)cyl_tabBadgePointView {
UIView *tabBadgePointView = objc_getAssociatedObject(self, @selector(cyl_tabBadgePointView));
if (tabBadgePointView == nil) {
tabBadgePointView = self.cyl_defaultTabBadgePointView;
objc_setAssociatedObject(self, @selector(cyl_tabBadgePointView), tabBadgePointView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return tabBadgePointView;
}
- (void)cyl_setTabBadgePointViewOffset:(UIOffset)tabBadgePointViewOffset {
objc_setAssociatedObject(self, @selector(cyl_tabBadgePointViewOffset), [NSValue valueWithUIOffset:tabBadgePointViewOffset], OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
//offset如果都是正数,则往右下偏移
- (UIOffset)cyl_tabBadgePointViewOffset {
id tabBadgePointViewOffsetObject = objc_getAssociatedObject(self, @selector(cyl_tabBadgePointViewOffset));
UIOffset tabBadgePointViewOffset = [tabBadgePointViewOffsetObject UIOffsetValue];
return tabBadgePointViewOffset;
}
- (UIView *)cyl_tabBadgeView {
for (UIView *subview in self.subviews) {
if ([subview cyl_isTabBadgeView]) {
return (UIView *)subview;
}
}
return nil;
}
- (UIImageView *)cyl_tabImageView {
for (UIImageView *subview in self.subviews) {
if ([subview cyl_isTabImageView]) {
return (UIImageView *)subview;
}
}
return nil;
}
- (UILabel *)cyl_tabLabel {
for (UILabel *subview in self.subviews) {
if ([subview cyl_isTabLabel]) {
return (UILabel *)subview;
}
}
return nil;
}
#pragma mark - private method
- (UIView *)cyl_defaultTabBadgePointView {
UIView *defaultRedTabBadgePointView = [UIView cyl_tabBadgePointViewWithClolor:[UIColor redColor] radius:4.5];
return defaultRedTabBadgePointView;
}
@end
** CYLTabBarControllerExtention总结:**
1、自定义了一个UIControl的分类,实现runtime添加了badgeView视图属性,以及控制是否badge视图是否显示,以及控制badge视图View的偏移设置