iOS 一行代码实现单行多按钮单选按钮事例

1、经常有单行多按钮单选效果的设计,大多数人第一想到的就是for循环UI和frame来创建,但
是项目中又引入了 masonry框架,masonry原本就是做UI布局的,那可不可以利用起来呢?答案
是可以的;
2、下面就使用masonry来简单实现一下单行多按钮单选效果,并且默认第一个按钮为默认按钮的场景:

// @property (nonatomic,  strong) UIView *rootView;
// @property (nonatomic,  strong) UIButton *childSelectedBtn;//声明一个全局默认按钮

    NSMutableArray *arraychildView = [NSMutableArray new];
    NSArray *titlechildArr = @[@"班级",@"院校",@"省份"];
    for (int i = 0; i < titlechildArr.count; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.backgroundColor = [UIColor colorWithHexString:@"F3F4F5"];
        button.tag = 1000 + I;
        [button setTitleColor:[UIColor colorWithHexString:@"000000"] forState:UIControlStateNormal];
        [button setTitle: titlechildArr[i] forState:UIControlStateNormal];
        [button addTarget:self action:@selector(childAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.rootView addSubview:button];
        [arraychildView addObject:button];
        if(button.tag == 1000) {
            self.childSelectedBtn = button;
            button.backgroundColor = [UIColor colorWithHexString:@"292A2E"];
            [button setTitleColor:[UIColor colorWithHexString:@"F1E5BF"] forState:UIControlStateNormal];
        }
    }
    [arraychildView mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:7 leadSpacing:14 tailSpacing:14];
    [arraychildView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.titleChildLabel.mas_bottom).offset(14);
    }];


- (void)childAction:(UIButton *)sender {
    // 未选中
    if (self.childSelectedBtn) {
        self.childSelectedBtn.backgroundColor = [UIColor colorWithHexString:@"F3F4F5"];
        [self.childSelectedBtn setTitleColor:[UIColor colorWithHexString:@"000000"] forState:UIControlStateNormal];
    }
    // 选中
    self.childSelectedBtn = sender;
    self.childSelectedBtn.backgroundColor = [UIColor colorWithHexString:@"292A2E"];
    [self.childSelectedBtn setTitleColor:[UIColor colorWithHexString:@"F1E5BF"] forState:UIControlStateNormal];

}

 

3、以上代码虽然功能实现了,但是如果比较多的标签场景下,代码量就很多了,需要复制一份以上代码,这样无意中增加了冗余代码,视觉上变得毫无观感;
那还有更好的办法吗?答案是有的;可对此优化升级(包装函数),代码如下:
引入头文件
 #import <objc/message.h> //(因为这里是动态赋值给到全局按钮)

/// 单行布局按钮 封装
/// - Parameters:
///   - titleArr: 按钮文字集合
///   - btntag: 按钮标识
///   - leadSpacing: 居左距离
///   - fixedSpacing: 中间间隙
///   - tailSpacing: 居右距离
///   - superLabel: 相对顶部label对象(这里可以根据自己的场景修改类型)
///   - topEqualToViewOffset: 相对上面的UI对象的间距
///   - globalButton: 将第一个按钮赋值给默认选中全局按钮  参数格式为:(selectedButton)
///   - subview: 添加到的父视图对象
///   - actionSEL: 按钮执行事件SEL
- (void)createLoopButtonWithTitleArr:(NSArray *)titleArr
                           buttonTag:(NSInteger)btntag
                         leadSpacing:(CGFloat)leadSpacing
                        fixedSpacing:(CGFloat)fixedSpacing
                         tailSpacing:(CGFloat)tailSpacing
                      topEqualToView:(UILabel *)superLabel
                topEqualToViewOffset:(CGFloat)topEqualToViewOffset
                    globalButtonName:(NSString *)globalButton
                          addSubview:(UIView *)subview
                              action:(SEL)actionSEL {
    
    NSMutableArray *arrayChildView = [NSMutableArray new];
    int countNum = (int)titleArr.count;
    for (int i = 0; i < countNum; i++) {
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.backgroundColor = [UIColor colorWithHexString:@"F3F4F5"];
        [button setTitleColor:[UIColor colorWithHexString:@"000000"] forState:UIControlStateNormal];
        button.titleLabel.font = [UIFont fontWithName:kFontRegular size:12];
        button.tag = btntag + i;
        [button setTitle:titleArr[i] forState:UIControlStateNormal];
        [button addTarget:self action:actionSEL forControlEvents:UIControlEventTouchUpInside];
        [subview addSubview:button];
        [arrayChildView addObject:button];
        if(button.tag == btntag) {
            if (globalButton && globalButton.length > 0) {
                globalButton = [globalButton stringByReplacingCharactersInRange:NSMakeRange(0,1) withString:[[globalButton substringToIndex:1] capitalizedString]];
                ((void(*)(id,SEL,id))objc_msgSend)(self, NSSelectorFromString([[@"set" stringByAppendingString:globalButton] stringByAppendingString:@":"]),button);
            }
            button.backgroundColor = [UIColor colorWithHexString:@"292A2E"];
            [button setTitleColor:[UIColor colorWithHexString:@"F1E5BF"] forState:UIControlStateNormal];
        }
    }
    [arrayChildView mas_distributeViewsAlongAxis:MASAxisTypeHorizontal withFixedSpacing:fixedSpacing leadSpacing:leadSpacing tailSpacing:tailSpacing];
    [arrayChildView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(superLabel.mas_bottom).offset(topEqualToViewOffset);
    }];
}

一行代码实现单行单选按钮事例:

    [self createLoopButtonWithTitleArr:@[@"半年内",@"一年内",@"两年内"] buttonTag:100 leadSpacing:14 fixedSpacing:7 tailSpacing:14 topEqualToView:self.titleNameLabel topEqualToViewOffset:14 globalButtonName:@"childSelectedBtn" addSubview:self.rootView action:@selector(childAction:)];

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用以下代码实现 iOS 按钮的背景渐变色:CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = self.btn.bounds; gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor whiteColor] CGColor], (id)[[UIColor blackColor] CGColor], nil]; [self.btn.layer insertSublayer:gradient atIndex:0]; ### 回答2: iOS按钮背景渐变色可以通过以下步骤使用OC代码实现: 1. 导入渐变色所需的头文件: ```objc #import <QuartzCore/QuartzCore.h> ``` 2. 创建按钮: ```objc UIButton *myButton = [[UIButton alloc] initWithFrame:CGRectMake(50, 50, 200, 50)]; [self.view addSubview:myButton]; ``` 3. 创建渐变色图层: ```objc CAGradientLayer *gradient = [CAGradientLayer layer]; gradient.frame = myButton.bounds; ``` 4. 设置渐变色图层的颜色: ```objc gradient.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor blueColor].CGColor]; ``` 5. 设置渐变色方向: ```objc // 横向渐变 gradient.startPoint = CGPointMake(0, 0.5); gradient.endPoint = CGPointMake(1, 0.5); // 纵向渐变 // gradient.startPoint = CGPointMake(0.5, 0); // gradient.endPoint = CGPointMake(0.5, 1); ``` 6. 将渐变色图层添加到按钮的背景图层中: ```objc [myButton.layer insertSublayer:gradient atIndex:0]; ``` 7. 最后,可以给按钮设置一些其他属性,如标题、字体等: ```objc [myButton setTitle:@"渐变按钮" forState:UIControlStateNormal]; [myButton.titleLabel setFont:[UIFont systemFontOfSize:17]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; ``` 通过以上步骤,即可通过OC代码实现iOS按钮的背景渐变色效果

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值