OC UIButton 分类 链式设置不同state的样式

作者 : 开心源码 本文共11699个字,预计阅读时间需要30分钟 发布时间: 2022-05-13 共172人阅读

效果

selectednormal

下载 demo点这里 希望对你有点帮助??

调用

UIButton *button = [UIButton new];    [self.view addSubview:button];    button.center = self.view.center;    button.bounds = CGRectMake(0, 0, 200, 200);
  1. 设置normal
[button setUpStyle:UIControlStateNormal style:^(UIButton *button) {        button        .setUpTitle(@"normal")        .setUpTitleColor([UIColor blueColor])        .setUpBorderWidth(5)        .setUpBorderColor([UIColor blueColor])        .setUpBackgroundColor([UIColor grayColor])        .setUpFont([UIFont systemFontOfSize:32])        .setUpCornerRadius(12);    }];
  1. 设置selected状态
[button setUpStyle:UIControlStateSelected style:^(UIButton *button) {        button        .setUpTitle(@"selected")        .setUpTitleColor([UIColor redColor])        .setUpBorderWidth(11)        .setUpBorderColor([UIColor redColor])        .setUpBackgroundColor([UIColor lightGrayColor])        .setUpFont([UIFont systemFontOfSize:20])        .setUpCornerRadius(100);    }];
  1. 刷新button的样式
    adjustButtonStyleWithState:state
- (void)click: (UIButton *)button {    button.selected = !button.selected;    UIControlState state = button.selected ? UIControlStateSelected : UIControlStateNormal;    [button adjustButtonStyleWithState:state];}

思路

1. 注意

非线程安全 需要在主线程调用
- (void)setUpStyle:(UIControlState) state style:(void(^)(UIButton *button))callBack

2. 实现

  1. 内部增加一个属性记录 setUpStyle:style: 传入的style
  2. 增加方法 字典,储存相应的状态下的相关样式
@property (nonatomic,assign) UIControlState setupState;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIColor *>*backgroundColorDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIColor *>*borderColorDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,NSNumber *>*borderWidthDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIFont *>*fontDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *, NSNumber *> *cornerRadiusDictionaryM;
  1. 增加方法,用来传入相应的属性
  1. 方法需要返回一个block,这个block的返回值需要是self
  2. block当做返回值,相当于顺传参数

.h

#import <UIKit/UIKit.h>@interface UIButton (Handler)/** * @brief 设置state对应的button样式 * * 当调用adjustButtonStyleWithState方法时,button才会改变到相应的样式 * @warning 注意: 非线程安全,到主线程升级参数 */- (void)setUpStyle:(UIControlState) state style:(void(^)(UIButton *button))callBack;/** * @brief 改变通过 setUpStyle:do: 方法设置好的button样式 * * @warning 注意: 假如某个样式没有找到相应state下的值,就会设置成normal状态下的样式 假如normal状态下仍未找到,则保持当前状态 */- (void) adjustButtonStyleWithState: (UIControlState) state;/** * @brief 设置normal 状态下的Font * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置state对应的font */- (UIButton *(^)(UIFont *)) setUpFont;/** * @brief 设置normal 状态下的titleColor * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置state对应的titleColor */- (UIButton *(^)(UIColor *)) setUpTitleColor;/** * @brief 设置normal 状态下的背景色 * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置state对应的backgroundColor */- (UIButton *(^)(UIColor *)) setUpBackgroundColor;/** * @brief 设置normal 状态下的Font * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置state对应的title */- (UIButton *(^)(NSString *)) setUpTitle;/** * @brief 设置normal 状态下的】AttributedString * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置state对应的AttributedString */- (UIButton *(^)(NSAttributedString *)) setUpAttributedString;/** * @brief 设置normal 状态下的image * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置的是对应state的image */- (UIButton *(^)(UIImage *)) setUpImage;/** * @brief 设置normal 状态下的backgroundImage * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置的是对应state的backgroundImage */- (UIButton *(^)(UIImage *)) setUpBackgroundImage;/** * @brief 设置normal 状态下的layer BorderWidth * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置的是对应state的BorderWidth */- (UIButton *(^)(CGFloat)) setUpBorderWidth;/** * @brief 设置normal 状态下的layer border color * * @return 返回 一个返回self的block. * * @warning 注意: 在 setUpStyle:setUp: 方法中 设置的是对应state的BorderColor */- (UIButton *(^)(UIColor *)) setUpBorderColor;@end

.m

#import "UIButton+Handler.h"#import <objc/runtime.h>static NSString *const k_setupState = @"k_setupState";static NSString *const k_setupBackgroundColorDictionaryM = @"k_setupBackgroundColorDictionaryM";static NSString *const k_borderColorDictionaryM = @"k_borderColorDictionaryM";static NSString *const k_borderWidthDictionaryM = @"k_borderWidthDictionaryM";static NSString *const k_fontDictionaryM = @"k_fontDictionaryM";static NSString *const k_cornerRadiusDictionaryM = @"k_cornerRadiusDictionaryM";@interface UIButton (Handler)@property (nonatomic,assign) UIControlState setupState;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIColor *>*backgroundColorDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIColor *>*borderColorDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,NSNumber *>*borderWidthDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *,UIFont *>*fontDictionaryM;@property (nonatomic,strong) NSMutableDictionary <NSNumber *, NSNumber *> *cornerRadiusDictionaryM;@end@implementation UIButton (Handler)- (UIButton *(^)(UIFont *)) setUpFont {    __weak typeof (self)weakSelf = self;    return ^(UIFont *font) {        if (weakSelf.state == weakSelf.setupState) {            weakSelf.titleLabel.font = font;        }        weakSelf.fontDictionaryM[@(weakSelf.setupState)] = font;        return weakSelf;    };}- (UIButton *(^)(CGFloat)) setUpCornerRadius {    __weak typeof (self) weakSelf = self;    return ^(CGFloat radius) {        if (weakSelf.setupState == weakSelf.state) {            weakSelf.layer.cornerRadius = radius;        }        weakSelf.cornerRadiusDictionaryM[@(weakSelf.setupState)] = @(radius);        return weakSelf;    };}- (void)setUpStyle:(UIControlState) state style:(void(^)(UIButton *button))callBack {        self.setupState = state;        callBack(self);        self.setupState = UIControlStateNormal;}- (UIButton *(^)(UIColor *)) setUpTitleColor {    __weak typeof (self)weakSelf = self;    return ^(UIColor *color) {        [weakSelf setTitleColor:color forState:weakSelf.setupState];        return weakSelf;    };}- (UIButton *(^)(UIColor *)) setUpBackgroundColor {    __weak typeof (self)weakSelf = self;    return ^(UIColor *color) {        weakSelf.backgroundColor = color;        weakSelf.backgroundColorDictionaryM[@(weakSelf.setupState)] = color;        return weakSelf;    };}- (UIButton *(^)(NSString *)) setUpTitle {    __weak typeof (self)weakSelf = self;    return ^(NSString *title) {        [weakSelf setTitle:title forState:weakSelf.setupState];        return weakSelf;    };}- (UIButton *(^)(NSAttributedString *)) setUpAttributedString {    __weak typeof (self)weakSelf = self;    return ^(NSAttributedString *attributedString) {        [weakSelf setAttributedTitle:attributedString forState:weakSelf.setupState];        return weakSelf;    };}- (UIButton *(^)(UIImage *))setUpImage {    __weak typeof (self)weakSelf = self;    return ^(UIImage *image) {        [weakSelf setImage:image forState:weakSelf.setupState];        return weakSelf;    };}- (UIButton *(^)(UIImage *))setUpBackgroundImage {    __weak typeof (self)weakSelf = self;    return ^(UIImage *image) {        [weakSelf setBackgroundImage:image forState:weakSelf.setupState];        return weakSelf;    };}- (UIButton *(^)(CGFloat)) setUpBorderWidth {    __weak typeof (self)weakSelf = self;    return ^(CGFloat borderW) {        if (weakSelf.state == weakSelf.setupState) {            weakSelf.layer.borderWidth = borderW;        }        weakSelf.borderWidthDictionaryM[@(weakSelf.setupState)] = @(borderW);        return weakSelf;    };}- (UIButton *(^)(UIColor *)) setUpBorderColor {    __weak typeof (self)weakSelf = self;    return ^(UIColor *color) {        if (weakSelf.state == weakSelf.setupState) {            weakSelf.layer.borderColor = color.CGColor;        }        weakSelf.borderColorDictionaryM[@(weakSelf.setupState)] = color;        return weakSelf;    };}- (void) adjustButtonStyleWithState: (UIControlState) state {    [self adjustBackgroundColorWithState:state];    [self adjustBorderColorWithState:state];    [self adjustBorderWidthWithState:state];    [self adjustFontWithState:state];    [self adjustCornerRadiusWithState:state];}- (void) adjustBackgroundColorWithState:(UIControlState)state {    NSNumber *currenState = @(state);    NSNumber *normalState = @(UIControlStateNormal);    UIColor *backgroundColor = self.backgroundColorDictionaryM[currenState];        /// backgroundColor    if (!backgroundColor) {        backgroundColor = self.backgroundColorDictionaryM[normalState];    }    if (backgroundColor) {        self.backgroundColor = backgroundColor;    }    }- (void) adjustBorderColorWithState:(UIControlState)state {    NSNumber *currenState = @(state);    NSNumber *normalState = @(UIControlStateNormal);    // borderColor    UIColor *borderColor = self.borderColorDictionaryM[currenState];    if (!borderColor) {        borderColor = self.borderColorDictionaryM[normalState];    }    if (borderColor) {        self.layer.borderColor = borderColor.CGColor;    }}- (void) adjustBorderWidthWithState:(UIControlState)state {    NSNumber *currenState = @(state);    NSNumber *normalState = @(UIControlStateNormal);    //borderWidth    NSNumber *borderWidthNumbser = self.borderWidthDictionaryM[currenState];    if (!borderWidthNumbser) {        borderWidthNumbser = self.borderWidthDictionaryM[normalState];    }    CGFloat borderWidth = borderWidthNumbser.floatValue;    self.layer.borderWidth = borderWidth;}- (void) adjustFontWithState:(UIControlState)state {    NSNumber *currenState = @(state);    NSNumber *normalState = @(UIControlStateNormal);    //borderWidth    UIFont *font = self.fontDictionaryM[currenState];    if (!font) {        font = self.fontDictionaryM[normalState];    }    if (font) {        self.titleLabel.font = font;    }}- (void) adjustCornerRadiusWithState:(UIControlState)state {    NSNumber *currenState = @(state);    NSNumber *normalState = @(UIControlStateNormal);    //borderWidth    NSNumber *value = self.cornerRadiusDictionaryM[currenState];    if (!value) {        value = self.cornerRadiusDictionaryM[normalState];    }    self.layer.cornerRadius = value.floatValue;}//MAKR: - get && set- (void)setSetupState:(UIControlState)setupState {    objc_setAssociatedObject(self, &k_setupState, @(setupState), OBJC_ASSOCIATION_ASSIGN);}- (UIControlState) setupState {    NSNumber *state = objc_getAssociatedObject(self, &k_setupState);    return state.integerValue;}- (void) setBackgroundColorDictionaryM:(NSMutableDictionary<NSNumber *,UIColor *> *)backgroundColorDictionaryM {    objc_setAssociatedObject(self, &k_setupBackgroundColorDictionaryM, backgroundColorDictionaryM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSMutableDictionary<NSNumber *,UIColor *> *)backgroundColorDictionaryM {    NSMutableDictionary<NSNumber *,UIColor *> *dic = objc_getAssociatedObject(self, &k_setupBackgroundColorDictionaryM);    if (!dic) {        dic = [NSMutableDictionary new];        objc_setAssociatedObject(self, &k_setupBackgroundColorDictionaryM, dic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    }    return dic;}- (void) setBorderColorDictionaryM:(NSMutableDictionary<NSNumber *,UIColor *> *)borderColorDictionaryM {     objc_setAssociatedObject(self, &k_borderColorDictionaryM, borderColorDictionaryM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSMutableDictionary<NSNumber *,UIColor *> *)borderColorDictionaryM {    NSMutableDictionary<NSNumber *,UIColor *> *dic = objc_getAssociatedObject(self, &k_borderColorDictionaryM);    if (!dic) {        dic = [NSMutableDictionary new];        objc_setAssociatedObject(self, &k_borderColorDictionaryM, dic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    }    return dic;}- (void)setBorderWidthDictionaryM:(NSMutableDictionary<NSNumber *,NSNumber *> *)borderWidthDictionaryM {     objc_setAssociatedObject(self, &k_borderWidthDictionaryM, borderWidthDictionaryM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSMutableDictionary<NSNumber *,NSNumber *> *)borderWidthDictionaryM {    NSMutableDictionary<NSNumber *,NSNumber *> *dic = objc_getAssociatedObject(self, &k_borderWidthDictionaryM);    if (!dic) {        dic = [NSMutableDictionary new];         objc_setAssociatedObject(self, &k_borderWidthDictionaryM, dic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    }    return dic;}- (void)setFontDictionaryM:(NSMutableDictionary<NSNumber *,UIFont *> *)fontDictionaryM {    objc_setAssociatedObject(self, &k_fontDictionaryM, fontDictionaryM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSMutableDictionary<NSNumber *,UIFont *> *)fontDictionaryM {    NSMutableDictionary<NSNumber *,UIFont *> *dic = objc_getAssociatedObject(self, &k_fontDictionaryM);    if (!dic) {        dic = [NSMutableDictionary new];        objc_setAssociatedObject(self, &k_fontDictionaryM, dic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    }    return dic;}- (void)setCornerRadiusDictionaryM:(NSMutableDictionary<NSNumber *,NSNumber *> *)cornerRadiusDictionaryM {    objc_setAssociatedObject(self, &k_cornerRadiusDictionaryM, cornerRadiusDictionaryM, OBJC_ASSOCIATION_RETAIN_NONATOMIC);}- (NSMutableDictionary<NSNumber *,NSNumber *> *)cornerRadiusDictionaryM {    NSMutableDictionary<NSNumber *,NSNumber *> *dic = objc_getAssociatedObject(self, &k_cornerRadiusDictionaryM);    if (!dic) {        dic = [NSMutableDictionary new];        objc_setAssociatedObject(self, &k_cornerRadiusDictionaryM, dic, OBJC_ASSOCIATION_RETAIN_NONATOMIC);    }    return dic;}@end

下载 demo点这里 希望对你有点帮助??

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » OC UIButton 分类 链式设置不同state的样式

发表回复