定制二选一按钮SwitchButton

效果:

源码:

SwitchButton.h 与 SwitchButton.m

//
// SwitchButton.h
// KongJian
//
// Created by YouXianMing on 14/10/24.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import <UIKit/UIKit.h> @protocol SwitchButtonDelegate <NSObject>
- (void)switchButtonState:(BOOL)state;
@end @interface SwitchButton : UIView /**
* 代理
*/
@property (nonatomic, assign) id<SwitchButtonDelegate> delegate; /**
* 3个view
*/
@property (nonatomic, strong) UIView *leftView;
@property (nonatomic, strong) UIView *rightView;
@property (nonatomic, strong) UIView *blockView; /**
* 动画持续时间
*/
@property (nonatomic, assign) NSTimeInterval duration; /**
* 块是否在左边
*/
@property (nonatomic, assign) BOOL blockAtLeft; /**
* 背景颜色
*/
@property (nonatomic, strong) UIColor *leftBackgroundColor;
@property (nonatomic, strong) UIColor *rightBackgroundColor; /**
* 便利的创建出按钮
*
* @param leftText 左边显示的文本
* @param rightText 右边显示的文本
* @param size button的尺寸
*
* @return button对象
*/
+ (SwitchButton *)createDefaultTypeButtonWithLeftText:(NSString *)leftText
rightText:(NSString *)rightText
size:(CGSize)size; @end
//
// SwitchButton.m
// KongJian
//
// Created by YouXianMing on 14/10/24.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "SwitchButton.h" @interface SwitchButton () @property (nonatomic, strong) UIButton *button; @property (nonatomic, strong) UIView *leftBackView;
@property (nonatomic, strong) UIView *rightBackView;
@property (nonatomic, strong) UIView *blockBackView; @end @implementation SwitchButton - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.layer.masksToBounds = YES; // 按钮
_button = [[UIButton alloc] initWithFrame:self.bounds];
[_button addTarget:self
action:@selector(buttonEvent)
forControlEvents:UIControlEventTouchUpInside];
[self addSubview:_button]; // 左侧view
_leftBackView = [[UIView alloc] initWithFrame:CGRectMake(, ,
self.bounds.size.width / .f,
self.bounds.size.height)];
_leftBackView.userInteractionEnabled = NO;
[self addSubview:_leftBackView]; // 右侧view
_rightBackView = [[UIView alloc] initWithFrame:CGRectMake(self.bounds.size.width / .f, ,
self.bounds.size.width / .f, self.bounds.size.height)];
_rightBackView.userInteractionEnabled = NO;
[self addSubview:_rightBackView]; // 遮挡用的view
_blockBackView = [[UIView alloc] initWithFrame:CGRectMake(, ,
self.bounds.size.width / .f,
self.bounds.size.height)];
_blockBackView.userInteractionEnabled = NO;
[self addSubview:_blockBackView]; }
return self;
} - (void)buttonEvent {
if (_blockBackView.frame.origin.x == ) {
if (_delegate) {
[_delegate switchButtonState:YES];
} [UIView animateWithDuration:(_duration > ? _duration : 0.2f)
animations:^{
_blockBackView.frame = CGRectMake(self.bounds.size.width / .f, ,
self.bounds.size.width / .f, self.bounds.size.height);
if (_leftBackgroundColor) {
_button.backgroundColor = _leftBackgroundColor;
} } completion:^(BOOL finished) { }];
} else {
[_delegate switchButtonState:NO];
[UIView animateWithDuration:(_duration > ? _duration : 0.2f)
animations:^{
_blockBackView.frame = CGRectMake(, ,
self.bounds.size.width / .f, self.bounds.size.height);
if (_rightBackgroundColor) {
_button.backgroundColor = _rightBackgroundColor;
}
} completion:^(BOOL finished) { }];
}
} @synthesize leftView = _leftView;
- (void)setLeftView:(UIView *)leftView {
_leftView = leftView;
leftView.userInteractionEnabled = NO;
[_leftBackView addSubview:leftView]; [self bringSubviewToFront:_blockBackView];
} @synthesize rightView = _rightView;
- (void)setRightView:(UIView *)rightView {
_rightView = rightView;
rightView.userInteractionEnabled = NO;
[_rightBackView addSubview:rightView]; [self bringSubviewToFront:_blockBackView];
} @synthesize blockView = _blockView;
- (void)setBlockView:(UIView *)blockView {
_blockView = blockView;
blockView.userInteractionEnabled = NO;
[_blockBackView addSubview:blockView]; [self bringSubviewToFront:_blockBackView];
} @synthesize blockAtLeft = _blockAtLeft;
- (void)setBlockAtLeft:(BOOL)blockAtLeft {
_blockAtLeft = blockAtLeft;
if (blockAtLeft == YES) {
_blockBackView.frame = CGRectMake(, ,
self.bounds.size.width / .f,
self.bounds.size.height);
} else {
_blockBackView.frame = CGRectMake(self.bounds.size.width / .f, ,
self.bounds.size.width / .f, self.bounds.size.height);
}
} #pragma mark - 便利构造器
+ (SwitchButton *)createDefaultTypeButtonWithLeftText:(NSString *)leftText
rightText:(NSString *)rightText
size:(CGSize)size {
SwitchButton *button = [[SwitchButton alloc] initWithFrame:CGRectMake(, , size.width, size.height)];
button.layer.cornerRadius = .f;
button.blockAtLeft = NO;
button.leftBackgroundColor = [UIColor colorWithRed:0.969 green:0.365 blue:0.137 alpha:];
button.backgroundColor = [UIColor colorWithRed:0.969 green:0.365 blue:0.137 alpha:];
button.rightBackgroundColor = [UIColor colorWithRed:0.278 green:0.835 blue:0.855 alpha:]; button.duration = 0.3f; // 左侧文本
UILabel *man = [[UILabel alloc] initWithFrame:CGRectMake(, , button.bounds.size.width/.f,
button.bounds.size.height)];
man.text = leftText;
man.textColor = [UIColor whiteColor];
man.font = [UIFont systemFontOfSize:.f];
man.textAlignment = NSTextAlignmentCenter;
button.leftView = man; // 右侧文本
UILabel *woman = [[UILabel alloc] initWithFrame:CGRectMake(, , button.bounds.size.width/.f,
button.bounds.size.height)];
woman.text = rightText;
woman.textColor = [UIColor whiteColor];
woman.font = [UIFont systemFontOfSize:.f];
woman.textAlignment = NSTextAlignmentCenter;
button.rightView = woman; // 中间挡住的块
UIView *blockView = [[UIView alloc] initWithFrame:CGRectMake(, , button.bounds.size.width/.f - ,
button.bounds.size.height - )];
blockView.layer.cornerRadius = .f;
blockView.backgroundColor = [UIColor whiteColor];
button.blockView = blockView; return button;
} @end

使用时候源码:

//
// ViewController.m
// KongJian
//
// Created by YouXianMing on 14/10/24.
// Copyright (c) 2014年 YouXianMing. All rights reserved.
// #import "ViewController.h"
#import "SwitchButton.h" @interface ViewController ()<SwitchButtonDelegate> @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; SwitchButton *button = [SwitchButton createDefaultTypeButtonWithLeftText:@"Y"
rightText:@"X"
size:CGSizeMake(, )];
button.delegate = self;
button.center = self.view.center;
[self.view addSubview:button];
} - (void)switchButtonState:(BOOL)state {
NSLog(@"%d", state);
} @end

核心的地方:

便利构造器(你可以自己去写):

定制二选一按钮SwitchButton的更多相关文章

  1. 设计多选一按钮ChooseOnlyButton

    设计多选一按钮ChooseOnlyButton 效果: 源码: ChooseOnlyButton.h 与 ChooseOnlyButton.m // // ChooseOnlyButton.h // ...

  2. sencha touch Model validations 自定义验证 二选一输入验证、重复验证、时间验证、比较验证、条件验证(2015-1-14)

    项目初始化时执行以下代码 //重写模型,方便进行自定义验证 Ext.define("Ext.zh.data.Model", { override: "Ext.data.M ...

  3. 设计可以多选的按钮ChooseManyButton

    设计可以多选的按钮ChooseManyButton 效果: 源码: ChooseManyButton.h 与 ChooseManyButton.m // // ChooseManyButton.h / ...

  4. 定制选择范围的按钮RangeButton

    定制选择范围的按钮RangeButton 效果: 源码: RangeButton.h 与 RangeButton.m // // RangeButton.h // PulsingView // // ...

  5. Android笔记-5-EditText密码和Checkbox二选一

    EditText密码:明文和密文 密文: public class MainActivity extends Activity { private EditText password = null; ...

  6. jquery validate 二选一,错误提示在一处

    转载自:http://blog.51yip.com/jsjquery/1483.html 有一同事对jquery validate这个插件不熟,实现多处报错信息在一处,并且还有二选一的情况,二个输入框 ...

  7. 三大视频网站Url的处理保存(视频和图片二选一操作)

    前台Js // 视频处理 var textVideoLink=$("input[name='textVideoLink']").val(); // 去除所有有的引号和空格 var ...

  8. JS流程控制语句 二选一 (if...else语句) 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时执行的代码}

    二选一 (if...else语句) if...else语句是在指定的条件成立时执行代码,在条件不成立时执行else后的代码. 语法: if(条件) { 条件成立时执行的代码} else {条件不成立时 ...

  9. html弹出二选一窗口,然后根据点击执行对应的js方法

    html弹出二选一窗口,然后根据点击执行对应的js方法 layer.confirm("我是弹出来的字", {btn:['确认','取消']}, function(){ ...方法1 ...

随机推荐

  1. centos7-默认启动方式改变

    在图形界面使用 ctrl+alt+F2切换到dos界面 dos界面 ctrl+alt+F2切换回图形界面 在命令上 输入 init 3 命令 切换到dos界面 输入 init 5命令 切换到图形界面 ...

  2. HTTP状态码列表

    经常用的http状态码 1xx消息——请求已被服务器接收,继续处理2xx成功——请求已成功被服务器接收.理解.并接受3xx重定向——需要后续操作才能完成这一请求4xx请求错误——请求含有词法错误或者无 ...

  3. Object类上的方法

    1.getClass: public final native Class<?> getClass(); 返回当前对象运行时的类的对象. 2.hashCode: public native ...

  4. c#基础学习(0630)之面向对象总习

    面向对象总习 1.封装.继承.多态 ****字段:存储数据,访问修饰符应该设置为private私有的 ****属性:保护字段,对字段的取值和赋值的限定 ****new关键字: 1.在堆中开辟空间(引用 ...

  5. Deep Q-Network 学习笔记(六)—— 改进④:dueling dqn

    这篇同样是完全没看懂 Orz,这里只做实现记录.. 要改动的地方只是在神经网络的最后一层做下调整即可. def create(self): neuro_layer_1 = 3 w_init = tf. ...

  6. Jsp&Servlet入门级项目全程实录第6讲

    惯例广告一发,对于初学真,真的很有用www.java1234.com,去试试吧! 1.建立数据表及数据(略) 2.创建student model package com.java1234.model; ...

  7. F#注解

    不要问我为啥要学F#——因为气质摆在那里 标注:以下内容均来自 anderslly F#系列 1.类型推演 let square x = x * x //接受一个某类型参数的quare函数返回一个这个 ...

  8. .NET异常处理的动作策略(Action Policy)

    SQL Server 2008基于策略的管理,基于策略的管理(Policy Based Management),使DBA们可以制定管理策略,并将这些策略应用到服务器.数据库以及数据环境中的其他对象上去 ...

  9. POJ3279(KB1-D 熄灯问题)

    Fliptile Description Farmer John knows that an intellectually satisfied cow is a happy cow who will ...

  10. C Traps:优先级常见错误

    逻辑与关系运算符 if (flags & FLAG != 0) {...} 这类错误以前也犯过,因为!=的优先级比&要高所以实际上是这样的 if (flags & (FLAG ...