设计多选一按钮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 == ) {
- return;
- }
- // 没有设置左边距则默认值为5.f
- if (_gapFromLeft == ) {
- _gapFromLeft = .f;
- }
- // 没有设置水平按钮间距则默认值为5.f
- if (_gapFromHorizontalButton == ) {
- _gapFromHorizontalButton = .f;
- }
- // 没有设置垂直按钮间距则默认值为5.f
- if (_gapFromVerticalButton == ) {
- _gapFromVerticalButton = .f;
- }
- // 没有设置按钮高度则按钮默认高度为20.f
- if (_buttonHeight == ) {
- _buttonHeight = .f;
- }
- // 获取frame宽度
- CGFloat frameWidth = self.bounds.size.width;
- // 计算出按钮宽度
- CGFloat buttonWidth = (frameWidth - _gapFromLeft* - _gapFromHorizontalButton)/.f;
- // 动态创建出按钮
- for (int i = ; i < _titles.count; i++) {
- UIButton *button = [[UIButton alloc] initWithFrame:\
- CGRectMake(_gapFromLeft + (buttonWidth + _gapFromHorizontalButton)*(i%),
- (i/)*(_buttonHeight + _gapFromVerticalButton),
- buttonWidth,
- _buttonHeight)];
- // 设置按钮圆角
- button.layer.cornerRadius = _buttonHeight/.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 - )/ + ) + _gapFromVerticalButton*((_titles.count - )/);
- CGRect rect = self.frame;
- rect.size.height = selfViewHeight;
- self.frame = rect;
- }
- - (CGRect)calculateFrame {
- // 没有元素则退出
- if (_titles.count == ) {
- return CGRectZero;
- }
- // 没有设置左边距则默认值为5.f
- if (_gapFromLeft == ) {
- _gapFromLeft = .f;
- }
- // 没有设置水平按钮间距则默认值为5.f
- if (_gapFromHorizontalButton == ) {
- _gapFromHorizontalButton = .f;
- }
- // 没有设置垂直按钮间距则默认值为5.f
- if (_gapFromVerticalButton == ) {
- _gapFromVerticalButton = .f;
- }
- // 没有设置按钮高度则按钮默认高度为20.f
- if (_buttonHeight == ) {
- _buttonHeight = .f;
- }
- // 根据控件的一些参数计算出高度
- CGFloat selfViewHeight = _buttonHeight*((_titles.count - )/ + ) + _gapFromVerticalButton*((_titles.count - )/);
- 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:]
- 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:].CGColor;
- button.layer.borderWidth = .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:]
- forState:UIControlStateNormal];
- }
- if (_selectedButtonBackgroundColor) {
- button.backgroundColor = _selectedButtonBackgroundColor;
- } else {
- button.backgroundColor = [UIColor colorWithRed:0.055 green:0.365 blue:0.663 alpha:];
- }
- button.layer.borderColor = [UIColor colorWithRed:0.055 green:0.365 blue:0.663 alpha:].CGColor;
- button.layer.borderWidth = .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(, , , )];
- label.textAlignment = NSTextAlignmentCenter;
- label.text = @"学挖掘机哪家强?";
- label.textColor = [UIColor grayColor];
- [self.view addSubview:label];
- button = [[ChooseOnlyButton alloc] initWithFrame:CGRectMake(, , , )];
- button.buttonHeight = .f;
- button.gapFromLeft = .f;
- button.gapFromVerticalButton = .f;
- button.gapFromHorizontalButton = .f;
- button.buttonTitleFont = [UIFont systemFontOfSize:.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
以下是需要注意的地方:
超高的可定制性
设计多选一按钮ChooseOnlyButton的更多相关文章
- 设计可以多选的按钮ChooseManyButton
设计可以多选的按钮ChooseManyButton 效果: 源码: ChooseManyButton.h 与 ChooseManyButton.m // // ChooseManyButton.h / ...
- 设计多选按钮ListChooseView
设计多选按钮ListChooseView 答应某位女屌丝而写的控件,效果还不错,开源给大家^_^! 效果图: 源码: // // ListChooseView.h // ScrollChooseBut ...
- js动态获取子复选项并设计全选及提交
在做项目的时候,会遇到根据父选项,动态的获取子选项,并列出多个复选框,提交时,把选中的合并成一个字符提交后台 本章将讲述如何通过js控制实现该操作: 1:设计父类别为radio,为每一个radio都加 ...
- 定制二选一按钮SwitchButton
定制二选一按钮SwitchButton 效果: 源码: SwitchButton.h 与 SwitchButton.m // // SwitchButton.h // KongJian // // C ...
- .NET开源工作流RoadFlow-表单设计-复选按钮组
复选按钮组的设置与单选按钮组的设置相同,只是表现形式为:<input type="checkbox"/>
- cocos2dx 3.x (单选,多选,复选checkBox按钮的实现) RadioButton
// // LandLordsMakeNewRoom.hpp // MalaGame39 // // Created by work on 2016/12/19. // // #ifndef ...
- xmlplus 组件设计系列之二 - 按钮
除了图标以外,按钮也许是最简单的组件了,现在来看看如何定义按钮组件. 使用原生按钮组件 在 xmlplus 中,HTML 元素也以组件的方式存在.所以,你可以直接通过使用 button 标签或者 in ...
- 聊聊Zookeeper应用场景、架构设计、选主机制
Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...
- UI设计, 弹出对话框 设计(区分强调按钮和普通按钮,给用户一个 正向建议的强调按钮)
在UI设计时,经常会需要 设计 弹出对话框,以下是个样式设计: 0.标准对话框 说明 Title space : 标题区 contents space : 内容区 function space: 功能 ...
随机推荐
- tomcat启动(三)Catalina分析-load方法分析
load()方法按从上到下顺序分析(主要分析本人所没学过的知识点,其它略过...). Digester类作用 使用sax技术对xml进行解析 未开始解析时Digester.push(this)这个用来 ...
- System.Windows.Forms.Timer的简单用法
Timer就是用来计时操作,如:你想在多少秒之后执行某个动作 Timer showTextBoxTimer = new Timer(); //新建一个Timer对象 showTextBoxTimer. ...
- android开发学习笔记系列(2)-android应用界面编程
前言 本篇博客将会简要介绍andriod开发过程中的一些界面元素和编程的实现,我将大家走进安卓的XML世界,当然可能会涉及到java代码,当然本文主要是介绍XML文件的界面布局. 那么我们的XML存在 ...
- LVS负载均衡DR模式部署
目录: 1. 拓扑图 2. 搭建环境 3. LVS服务器部署 4. 测试 1. 拓扑图 LVS-DR模式采的IP地址全部为外网IP. 本例中IP的设置全部采用临时设置IP的方式,重启后会 ...
- c# 键值对照表
虚拟键值表 虚拟键 十六进制值 十进制值 相应键盘或鼠标键 VK_LBUTTON 1 1 鼠标左键 VK_RBUTTON 2 2 鼠标右键 VK_CANCEL 3 3 Ctrl-Break键 VK_M ...
- awk去重以某列重复的行
[root@localhost cc]# cat 2.txt adc 3 5 a d aa 3 adfa d ba 3 adf 去重第一列重复的行: [root@localhost cc]# cat ...
- 基于.NET Core2的图片上传
其实,.NET Core2的图片上传挺好做的,只是,有些坑要注意.......话不多说,上代码 public async Task<IActionResult> Upload([FromS ...
- java 对CSV 文件的读取与生成
CSV文件是以逗号分隔值的文件格式,一般用WORDPAD或记事本(NOTE),EXCEL打开.CSV(逗号分隔值)是一种用来存储数据的纯文本文件,通常都是用于存放电子表格或数据的一种文件格式,对于CS ...
- 《码出高效 Java开发手册》第四章 走进JVM(未整理)
码云地址: https://gitee.com/forxiaoming/JavaBaseCode/tree/master/EasyCoding
- js-权威指南学习笔记3
第四章 表达式和运算符 1.最简单的表达式是原始表达式,是表达式的最小单位——它们不再包含其他表达式.JS中原始表达式包含常量或直接量.关键字和变量. 2.一个对象的属性名不是固定值时,必须使用方括号 ...