• 设计多选一按钮ChooseOnlyButton


    设计多选一按钮ChooseOnlyButton

    效果:

    源码:

    ChooseOnlyButton.h 与 ChooseOnlyButton.m

    //
    //  ChooseOnlyButton.h
    //  ChooseOnlyButton
    //
    //  Created by YouXianMing on 14/11/4.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import <UIKit/UIKit.h>
    @class ChooseOnlyButton;
    
    @protocol ChooseOnlyButtonDelegate <NSObject>
    @optional
    - (void)chooseButtonTitle:(NSString *)title;
    @end
    
    @interface ChooseOnlyButton : UIView
    
    /**
     *  代理
     */
    @property (nonatomic, assign) id<ChooseOnlyButtonDelegate>  delegate;
    
    /**
     *  选取的按钮的标题(只读)
     */
    @property (nonatomic, strong, readonly)  NSString *selectedTitle;
    
    /**
     *  标题的数组
     */
    @property (nonatomic, strong) NSArray  *titles;
    
    /**
     *  按钮离左侧的距离
     */
    @property (nonatomic, assign) CGFloat   gapFromLeft;
    
    /**
     *  两个按钮之间的水平距离
     */
    @property (nonatomic, assign) CGFloat   gapFromHorizontalButton;
    
    /**
     *  两个按钮之间的垂直间距
     */
    @property (nonatomic, assign) CGFloat   gapFromVerticalButton;
    
    /**
     *  按钮高度
     */
    @property (nonatomic, assign) CGFloat   buttonHeight;
    
    /**
     *  按钮标题字体
     */
    @property (nonatomic, strong) UIFont   *buttonTitleFont;
    
    /**
     *  没有选中状态下的按钮的背景颜色以及按钮字体的颜色
     */
    @property (nonatomic, strong) UIColor  *normalButtonBackgroundColor;
    @property (nonatomic, strong) UIColor  *normalButtonTitleColor;
    
    /**
     *  选中状态下的按钮的背景颜色以及按钮字体的颜色
     */
    @property (nonatomic, strong) UIColor  *selectedButtonBackgroundColor;
    @property (nonatomic, strong) UIColor  *selectedButtonTitleColor;
    
    
    
    /**
     *  重设view的尺寸并且创建出新的按钮
     */
    - (void)resetSizeAndCreateButtons;
    
    /**
     *  重新计算frame
     *
     *  @return frame值
     */
    - (CGRect)calculateFrame;
    
    @end
    //
    //  ChooseOnlyButton.m
    //  ChooseOnlyButton
    //
    //  Created by YouXianMing on 14/11/4.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import "ChooseOnlyButton.h"
    
    @implementation ChooseOnlyButton
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            
        }
        return self;
    }
    
    - (void)resetSizeAndCreateButtons {
        
        // 没有元素则退出
        if (_titles.count == 0) {
            return;
        }
    
        // 没有设置左边距则默认值为5.f
        if (_gapFromLeft == 0) {
            _gapFromLeft = 5.f;
        }
        
        // 没有设置水平按钮间距则默认值为5.f
        if (_gapFromHorizontalButton == 0) {
            _gapFromHorizontalButton = 5.f;
        }
        
        // 没有设置垂直按钮间距则默认值为5.f
        if (_gapFromVerticalButton == 0) {
            _gapFromVerticalButton = 5.f;
        }
        
        // 没有设置按钮高度则按钮默认高度为20.f
        if (_buttonHeight == 0) {
            _buttonHeight = 20.f;
        }
        
        // 获取frame宽度
        CGFloat frameWidth  = self.bounds.size.width;
        
        // 计算出按钮宽度
        CGFloat buttonWidth = (frameWidth - _gapFromLeft*2 - _gapFromHorizontalButton)/2.f;
        
        // 动态创建出按钮
        for (int i = 0; i < _titles.count; i++) {
            UIButton *button = [[UIButton alloc] initWithFrame:
                                CGRectMake(_gapFromLeft + (buttonWidth + _gapFromHorizontalButton)*(i%2),
                                           (i/2)*(_buttonHeight + _gapFromVerticalButton),
                                           buttonWidth,
                                           _buttonHeight)];
            
            // 设置按钮圆角
            button.layer.cornerRadius = _buttonHeight/2.f;
            [button addTarget:self
                       action:@selector(buttonsEvent:)
             forControlEvents:UIControlEventTouchUpInside];
            
            // 设置按钮标题 + 默认的标题颜色
            [button setTitle:_titles[i] forState:UIControlStateNormal];
            [self normalButtonStyle:button];
    
            // 设置字体
            if (_buttonTitleFont) {
                button.titleLabel.font = _buttonTitleFont;
            }
            
            [self addSubview:button];
        }
        
        // 重设自身view高度
        CGFloat selfViewHeight = _buttonHeight*((_titles.count - 1)/2 + 1) + _gapFromVerticalButton*((_titles.count - 1)/2);
        CGRect rect            = self.frame;
        rect.size.height       = selfViewHeight;
        self.frame             = rect;
    }
    
    - (CGRect)calculateFrame {
        
        // 没有元素则退出
        if (_titles.count == 0) {
            return CGRectZero;
        }
        
        // 没有设置左边距则默认值为5.f
        if (_gapFromLeft == 0) {
            _gapFromLeft = 5.f;
        }
        
        // 没有设置水平按钮间距则默认值为5.f
        if (_gapFromHorizontalButton == 0) {
            _gapFromHorizontalButton = 5.f;
        }
        
        // 没有设置垂直按钮间距则默认值为5.f
        if (_gapFromVerticalButton == 0) {
            _gapFromVerticalButton = 5.f;
        }
        
        // 没有设置按钮高度则按钮默认高度为20.f
        if (_buttonHeight == 0) {
            _buttonHeight = 20.f;
        }
        
        // 根据控件的一些参数计算出高度
        CGFloat selfViewHeight = _buttonHeight*((_titles.count - 1)/2 + 1) + _gapFromVerticalButton*((_titles.count - 1)/2);
        CGRect rect            = self.frame;
        rect.size.height       = selfViewHeight;
        
        // 返回控件
        return rect;
    }
    
    - (void)buttonsEvent:(UIButton *)button {
    
        [[self subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            if ([obj isKindOfClass:[UIButton class]]) {
                if ([button isEqual:obj]) {
                    // 选中按钮的样式
                    [self selectButtonStyle:obj];
                    
                    UIButton *button = (UIButton *)obj;
                    
                    // 获取到选取的按钮标题
                    _selectedTitle = button.titleLabel.text;
                    
                    // 代理
                    if (_delegate && [_delegate respondsToSelector:@selector(chooseButtonTitle:)]) {
                        
                        [_delegate chooseButtonTitle:button.titleLabel.text];
                    }
                } else {
                    [self normalButtonStyle:obj];
                }
            }
        }];
    }
    
    #pragma mark - 私有方法
    /**
     *  普通按钮的样式
     *
     *  @param button 要改变样式的按钮
     */
    - (void)normalButtonStyle:(UIButton *)button {
        
        if (_normalButtonTitleColor) {
            [button setTitleColor:_normalButtonTitleColor
                         forState:UIControlStateNormal];
        } else {
            [button setTitleColor:[UIColor colorWithRed:0.000 green:0.361 blue:0.671 alpha:1]
                         forState:UIControlStateNormal];
        }
    
        if (_normalButtonBackgroundColor) {
            button.backgroundColor = _normalButtonBackgroundColor;
        } else {
            button.backgroundColor = [UIColor clearColor];
        }
        
        button.layer.borderColor = [UIColor colorWithRed:0.843 green:0.843 blue:0.843 alpha:1].CGColor;
        button.layer.borderWidth = 1.f;
    }
    
    /**
     *  选中按钮时的样式
     *
     *  @param button 要改变样式的按钮
     */
    - (void)selectButtonStyle:(UIButton *)button {
        
        if (_selectedButtonTitleColor) {
            [button setTitleColor:_selectedButtonTitleColor
                         forState:UIControlStateNormal];
        } else {
            [button setTitleColor:[UIColor colorWithRed:0.973 green:0.984 blue:0.988 alpha:1]
                         forState:UIControlStateNormal];
        }
    
        if (_selectedButtonBackgroundColor) {
            button.backgroundColor = _selectedButtonBackgroundColor;
        } else {
            button.backgroundColor = [UIColor colorWithRed:0.055 green:0.365 blue:0.663 alpha:1];
        }
        
        button.layer.borderColor = [UIColor colorWithRed:0.055 green:0.365 blue:0.663 alpha:1].CGColor;
        button.layer.borderWidth = 1.f;
    }
    
    @end

    使用时候的源码:

    //
    //  ViewController.m
    //  ChooseOnlyButton
    //
    //  Created by YouXianMing on 14/11/4.
    //  Copyright (c) 2014年 YouXianMing. All rights reserved.
    //
    
    #import "ViewController.h"
    #import "ChooseOnlyButton.h"
    
    @interface ViewController ()<ChooseOnlyButtonDelegate>
    
    {
        ChooseOnlyButton *button;
    }
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        UILabel *label      = [[UILabel alloc] initWithFrame:CGRectMake(0, 50, 320, 30)];
        label.textAlignment = NSTextAlignmentCenter;
        label.text          = @"学挖掘机哪家强?";
        label.textColor     = [UIColor grayColor];
        [self.view addSubview:label];
        
        button                         = [[ChooseOnlyButton alloc] initWithFrame:CGRectMake(0, 100, 320, 400)];
        button.buttonHeight            = 25.f;
        button.gapFromLeft             = 10.f;
        button.gapFromVerticalButton   = 20.f;
        button.gapFromHorizontalButton = 10.f;
        button.buttonTitleFont         = [UIFont systemFontOfSize:16.f];
        button.titles                  = @[@"A. 蓝翔",
                                           @"B. blueShit",
                                           @"C. YouXianMing",
                                           @"D. 不知道"];
        button.delegate                = self;
        
        [self.view addSubview:button];
        
        // 设置完所有参数后创建出控件
        [button resetSizeAndCreateButtons];
    }
    
    #pragma mark - 代理
    - (void)chooseButtonTitle:(NSString *)title {
        NSLog(@"%@", title);
        NSLog(@"%@", button.selectedTitle);
    }
    
    @end

    以下是需要注意的地方:

    超高的可定制性

  • 相关阅读:
    通过Powershell开启RDP
    映射网络驱动器
    简易图书管理系统
    使用IDEA快速创建Spring Boot项目
    oracle11g安装步骤详细图文教程
    使用JDOM创建XML文档
    使用JDOM解析XML文档
    HTML+CSS之金立官网部分实现
    webstorm2019安装与使用详细教程
    第二章 JavaScript基础指令
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4073513.html
Copyright © 2020-2023  润新知