123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- //
- // YPTabItem.m
- // YPTabBarController
- //
- // Created by 喻平 on 15/8/11.
- // Copyright (c) 2015年 YPTabBarController. All rights reserved.
- //
- #import "YPTabItem.h"
- @interface YPTabItem ()
- @property (nonatomic, strong) UIButton *badgeButton;
- @property (nonatomic, strong) UIView *doubleTapView;
- @property (nonatomic, assign) CGFloat verticalOffset;
- @property (nonatomic, assign) CGFloat spacing;
- @property (nonatomic, strong) CALayer *separatorLayer;
- @property (nonatomic, assign) CGFloat numberBadgeMarginTop;
- @property (nonatomic, assign) CGFloat numberBadgeCenterMarginRight;
- @property (nonatomic, assign) CGFloat numberBadgeTitleHorizonalSpace;
- @property (nonatomic, assign) CGFloat numberBadgeTitleVerticalSpace;
- @property (nonatomic, assign) CGFloat dotBadgeMarginTop;
- @property (nonatomic, assign) CGFloat dotBadgeCenterMarginRight;
- @property (nonatomic, assign) CGFloat dotBadgeSideLength;
- @property (nonatomic, copy) void (^doubleTapHandler)(void);
- @end
- @implementation YPTabItem
- - (instancetype)init {
- self = [super init];
- if (self) {
- [self awakeFromNib];
- }
- return self;
- }
- - (void)awakeFromNib {
- [super awakeFromNib];
-
- self.backgroundColor=[UIColor whiteColor];
- self.badgeButton = [UIButton buttonWithType:UIButtonTypeCustom];
- self.badgeButton.userInteractionEnabled = NO;
- self.badgeButton.clipsToBounds = YES;
- [self addSubview:self.badgeButton];
-
- _badgeStyle = YPTabItemBadgeStyleNumber;
- self.badge = 0;
- // _verticalOffset = 5;
- // _spacing = 5;
- // _contentHorizontalCenter = YES;
- // self.badgeTitleColor = [UIColor whiteColor];
- // self.badgeTitleFont = [UIFont systemFontOfSize:13];
- // self.badgeBackgroundColor = BADGE_BG_COLOR_DEFAULT;
- // self.numberBadgeFrame = YPTabItemBadgeFrameMake(2, 20, 16);
- // self.dotBadgeFrame = YPTabItemBadgeFrameMake(5, 25, 10);
- }
- - (void)setHighlighted:(BOOL)highlighted {
-
- }
- - (void)setContentHorizontalCenter:(BOOL)contentHorizontalCenter {
- _contentHorizontalCenter = contentHorizontalCenter;
- if (!_contentHorizontalCenter) {
- self.verticalOffset = 0;
- self.spacing = 0;
- }
- if (self.superview) {
- [self layoutSubviews];
- }
- }
- - (void)setContentHorizontalCenterWithVerticalOffset:(CGFloat)verticalOffset
- spacing:(CGFloat)spacing {
- self.verticalOffset = verticalOffset;
- self.spacing = spacing;
- self.contentHorizontalCenter = YES;
- }
- - (void)layoutSubviews {
- [super layoutSubviews];
- if ([self imageForState:UIControlStateNormal] && self.contentHorizontalCenter) {
- CGSize titleSize = self.titleLabel.frame.size;
- CGSize imageSize = self.imageView.frame.size;
- titleSize = CGSizeMake(ceilf(titleSize.width), ceilf(titleSize.height));
- CGFloat totalHeight = (imageSize.height + titleSize.height + self.spacing);
- self.imageEdgeInsets = UIEdgeInsetsMake(- (totalHeight - imageSize.height - self.verticalOffset), 0, 0, - titleSize.width);
- self.titleEdgeInsets = UIEdgeInsetsMake(self.verticalOffset, - imageSize.width, - (totalHeight - titleSize.height), 0);
- } else {
- self.imageEdgeInsets = UIEdgeInsetsZero;
- self.titleEdgeInsets = UIEdgeInsetsZero;
- }
- }
- - (void)setSelected:(BOOL)selected {
- [super setSelected:selected];
- if (self.doubleTapView) {
- self.doubleTapView.hidden = !selected;
- }
- }
- - (void)setDoubleTapHandler:(void (^)(void))handler {
- _doubleTapHandler = handler;
- if (!self.doubleTapView) {
- self.doubleTapView = [[UIView alloc] initWithFrame:self.bounds];
- [self addSubview:self.doubleTapView];
- UITapGestureRecognizer *doubleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self
- action:@selector(doubleTapped:)];
- doubleRecognizer.numberOfTapsRequired = 2;
- [self.doubleTapView addGestureRecognizer:doubleRecognizer];
- }
- }
- - (void)doubleTapped:(UITapGestureRecognizer *)recognizer {
- if (self.doubleTapHandler) {
- self.doubleTapHandler();
- }
- }
- - (void)setFrame:(CGRect)frame {
- [super setFrame:frame];
- _frameWithOutTransform = frame;
- if (self.doubleTapView) {
- self.doubleTapView.frame = self.bounds;
- }
- }
- #pragma mark - Title and Image
- - (void)setTitle:(NSString *)title {
- _title = title;
- [self setTitle:title forState:UIControlStateNormal];
- }
- - (void)setTitleColor:(UIColor *)titleColor {
- _titleColor = titleColor;
- [self setTitleColor:titleColor forState:UIControlStateNormal];
- }
- - (void)setTitleSelectedColor:(UIColor *)titleSelectedColor {
- _titleSelectedColor = titleSelectedColor;
- [self setTitleColor:titleSelectedColor forState:UIControlStateSelected];
- }
- - (void)setTitleFont:(UIFont *)titleFont {
- _titleFont = titleFont;
- if ([UIDevice currentDevice].systemVersion.integerValue >= 8) {
- self.titleLabel.font = titleFont;
- }
- }
- - (void)setImage:(UIImage *)image {
- _image = image;
- [self setImage:image forState:UIControlStateNormal];
- }
- - (void)setSelectedImage:(UIImage *)selectedImage {
- _selectedImage = selectedImage;
- [self setImage:selectedImage forState:UIControlStateSelected];
- }
- #pragma mark - Badge
- - (void)setBadge:(NSInteger)badge {
- _badge = badge;
- [self updateBadge];
- }
- - (void)setBadgeStyle:(YPTabItemBadgeStyle)badgeStyle {
- _badgeStyle = badgeStyle;
- [self updateBadge];
- }
- - (void)updateBadge {
- if (self.badgeStyle == YPTabItemBadgeStyleNumber) {
- if (self.badge == 0) {
- self.badgeButton.hidden = YES;
- } else {
- NSString *badgeStr = @(self.badge).stringValue;
- if (self.badge > 99) {
- badgeStr = @"99+";
- } else if (self.badge < -99) {
- badgeStr = @"-99+";
- }
-
- CGSize size = [badgeStr boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, CGFLOAT_MAX)
- options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading
- attributes:@{NSFontAttributeName : self.badgeButton.titleLabel.font}
- context:nil].size;
- CGFloat width = ceilf(size.width) + self.numberBadgeTitleHorizonalSpace;
- CGFloat height = ceilf(size.height) + self.numberBadgeTitleVerticalSpace;
- width = MAX(width, height);
- self.badgeButton.frame = CGRectMake(self.bounds.size.width - width / 2 - self.numberBadgeCenterMarginRight,
- self.numberBadgeMarginTop,
- width,
- height);
- self.badgeButton.layer.cornerRadius = self.badgeButton.bounds.size.height / 2;
- [self.badgeButton setTitle:badgeStr forState:UIControlStateNormal];
- self.badgeButton.hidden = NO;
- }
- } else if (self.badgeStyle == YPTabItemBadgeStyleDot) {
- [self.badgeButton setTitle:nil forState:UIControlStateNormal];
- self.badgeButton.frame = CGRectMake(self.bounds.size.width - self.dotBadgeCenterMarginRight - self.dotBadgeSideLength,
- self.dotBadgeMarginTop,
- self.dotBadgeSideLength,
- self.dotBadgeSideLength);
- self.badgeButton.layer.cornerRadius = self.badgeButton.bounds.size.height / 2;
- self.badgeButton.hidden = NO;
- }
- }
- - (void)setNumberBadgeMarginTop:(CGFloat)marginTop
- centerMarginRight:(CGFloat)centerMarginRight
- titleHorizonalSpace:(CGFloat)titleHorizonalSpace
- titleVerticalSpace:(CGFloat)titleVerticalSpace {
- self.numberBadgeMarginTop = marginTop;
- self.numberBadgeCenterMarginRight = centerMarginRight;
- self.numberBadgeTitleHorizonalSpace = titleHorizonalSpace;
- self.numberBadgeTitleVerticalSpace = titleVerticalSpace;
- [self updateBadge];
- }
- - (void)setDotBadgeMarginTop:(CGFloat)marginTop
- centerMarginRight:(CGFloat)centerMarginRight
- sideLength:(CGFloat)sideLength {
- self.dotBadgeMarginTop = marginTop;
- self.dotBadgeCenterMarginRight = centerMarginRight;
- self.dotBadgeSideLength = sideLength;
- [self updateBadge];
- }
- - (void)setBadgeBackgroundColor:(UIColor *)badgeBackgroundColor {
- _badgeBackgroundColor = badgeBackgroundColor;
- self.badgeButton.backgroundColor = badgeBackgroundColor;
- }
- - (void)setBadgeTitleColor:(UIColor *)badgeTitleColor {
- _badgeTitleColor = badgeTitleColor;
- [self.badgeButton setTitleColor:badgeTitleColor forState:UIControlStateNormal];
- }
- - (void)setBadgeBackgroundImage:(UIImage *)badgeBackgroundImage {
- _badgeBackgroundImage = badgeBackgroundImage;
- [self.badgeButton setBackgroundImage:badgeBackgroundImage forState:UIControlStateNormal];
- }
- - (void)setBadgeTitleFont:(UIFont *)badgeTitleFont {
- _badgeTitleFont = badgeTitleFont;
- self.badgeButton.titleLabel.font = badgeTitleFont;
- [self updateBadge];
- }
- @end
|