iOS_带文字的UISwitch
来源:互联网 发布:python中sleep函数 编辑:程序博客网 时间:2024/04/20 08:29
#import <UIKit/UIKit.h>@interface ZJSwitch : UIControl@property (nonatomic, assign, getter = isOn) BOOL on;@property (nonatomic, strong) UIColor *onTintColor;@property (nonatomic, strong) UIColor *tintColor;@property (nonatomic, strong) UIColor *thumbTintColor;@property (nonatomic, strong) UIColor *textColor;@property (nonatomic, strong) UIFont *textFont;@property (nonatomic, strong) NSString *onText;@property (nonatomic, strong) NSString *offText;- (void)setOn:(BOOL)on animated:(BOOL)animated;@end
/* * Copyright (c) 2014, James <jamesqianlee@gmail.com> All rights reserved. * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of James nor the names of its contributors may * be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY JAMES "AS IS" AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL JAMES AND CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#import "ZJSwitch.h"#define ZJSwitchMaxHeight 31.0f#define ZJSwitchMinHeight 31.0f#define ZJSwitchMinWidth 51.0f#define ZJSwitchKnobSize 28.0f@interface ZJSwitch ()@property (nonatomic, strong) UIView *containerView;@property (nonatomic, strong) UIView *onContentView;@property (nonatomic, strong) UIView *offContentView;@property (nonatomic, strong) UIView *knobView;@property (nonatomic, strong) UILabel *onLabel;@property (nonatomic, strong) UILabel *offLabel;- (void)commonInit;- (CGRect)roundRect:(CGRect)frameOrBounds;- (void)handleTapTapGestureRecognizerEvent:(UITapGestureRecognizer *)recognizer;- (void)handlePanGestureRecognizerEvent:(UIPanGestureRecognizer *)recognizer;@end@implementation ZJSwitch- (id)initWithFrame:(CGRect)frame{ self = [super initWithFrame:[self roundRect:frame]]; if (self) { [self commonInit]; } return self;}- (id)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder]; if (self) { [self commonInit]; } return self;}- (void)setBounds:(CGRect)bounds{ [super setBounds:[self roundRect:bounds]]; [self setNeedsLayout];}- (void)setFrame:(CGRect)frame{ [super setFrame:[self roundRect:frame]]; [self setNeedsLayout];}- (void)setOnText:(NSString *)onText{ if (_onText != onText) { _onText = onText; _onLabel.text = onText; }}- (void)setOffText:(NSString *)offText{ if (_offText != offText) { _offText = offText; _offLabel.text = offText; }}- (void)setOnTintColor:(UIColor *)onTintColor{ if (_onTintColor != onTintColor) { _onTintColor = onTintColor; _onContentView.backgroundColor = onTintColor; }}- (void)setTintColor:(UIColor *)tintColor{ if (_tintColor != tintColor) { _tintColor = tintColor; _offContentView.backgroundColor = tintColor; }}- (void)setThumbTintColor:(UIColor *)thumbTintColor{ if (_thumbTintColor != thumbTintColor) { _thumbTintColor = thumbTintColor; _knobView.backgroundColor = _thumbTintColor; }}- (void)layoutSubviews{ [super layoutSubviews]; self.containerView.frame = self.bounds; CGFloat r = CGRectGetHeight(self.containerView.bounds) / 2.0; self.containerView.layer.cornerRadius = r; self.containerView.layer.masksToBounds = YES; CGFloat margin = (CGRectGetHeight(self.bounds) - ZJSwitchKnobSize) / 2.0; if (!self.isOn) { // frame of off status self.onContentView.frame = CGRectMake(-1 * CGRectGetWidth(self.containerView.bounds), 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.knobView.frame = CGRectMake(margin, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } else { // frame of on status self.onContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, CGRectGetWidth(self.containerView.bounds), CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.knobView.frame = CGRectMake(CGRectGetWidth(self.containerView.bounds) - margin - ZJSwitchKnobSize, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } CGFloat lHeight = 20.0f; CGFloat lMargin = r - (sqrtf(powf(r, 2) - powf(lHeight / 2.0, 2))) + margin; self.onLabel.frame = CGRectMake(lMargin, r - lHeight / 2.0, CGRectGetWidth(self.onContentView.bounds) - lMargin - ZJSwitchKnobSize - 2 * margin, lHeight); self.offLabel.frame = CGRectMake(ZJSwitchKnobSize + 2 * margin, r - lHeight / 2.0, CGRectGetWidth(self.onContentView.bounds) - lMargin - ZJSwitchKnobSize - 2 * margin, lHeight);}- (void)setOn:(BOOL)on{ [self setOn:on animated:YES];}- (void)setOn:(BOOL)on animated:(BOOL)animated{ if (_on == on) { return; } _on = on; CGFloat margin = (CGRectGetHeight(self.bounds) - ZJSwitchKnobSize) / 2.0; if (!animated) { if (!self.isOn) { // frame of off status self.onContentView.frame = CGRectMake(-1 * CGRectGetWidth(self.containerView.bounds), 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.knobView.frame = CGRectMake(margin, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } else { // frame of on status self.onContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, CGRectGetWidth(self.containerView.bounds), CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.knobView.frame = CGRectMake(CGRectGetWidth(self.containerView.bounds) - margin - ZJSwitchKnobSize, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } } else { if (self.isOn) { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(CGRectGetWidth(self.containerView.bounds) - margin - ZJSwitchKnobSize, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } completion:^(BOOL finished){ self.onContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, CGRectGetWidth(self.containerView.bounds), CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); }]; } else { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(margin, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); } completion:^(BOOL finished){ self.onContentView.frame = CGRectMake(-1 * CGRectGetWidth(self.containerView.bounds), 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); self.offContentView.frame = CGRectMake(0, 0, CGRectGetWidth(self.containerView.bounds), CGRectGetHeight(self.containerView.bounds)); }]; } } [self sendActionsForControlEvents:UIControlEventValueChanged];}#pragma mark - Private API- (void)commonInit{ self.backgroundColor = [UIColor clearColor]; _onTintColor = [UIColor colorWithRed:130 / 255.0 green:200 / 255.0 blue:90 / 255.0 alpha:1.0]; _tintColor = [UIColor colorWithWhite:0.75 alpha:1.0]; _thumbTintColor = [UIColor colorWithWhite:1.0 alpha:1.0]; _textFont = [UIFont systemFontOfSize:18.0f]; _textColor = [UIColor whiteColor]; _containerView = [[UIView alloc] initWithFrame:self.bounds]; _containerView.backgroundColor = [UIColor clearColor]; [self addSubview:_containerView]; _onContentView = [[UIView alloc] initWithFrame:self.bounds]; _onContentView.backgroundColor = _onTintColor; [_containerView addSubview:_onContentView]; _offContentView = [[UIView alloc] initWithFrame:self.bounds]; _offContentView.backgroundColor = _tintColor; [_containerView addSubview:_offContentView]; _knobView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, ZJSwitchKnobSize, ZJSwitchKnobSize)]; _knobView.backgroundColor = _thumbTintColor; _knobView.layer.cornerRadius = ZJSwitchKnobSize / 2.0; [_containerView addSubview:_knobView]; _onLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _onLabel.backgroundColor = [UIColor clearColor]; _onLabel.textAlignment = NSTextAlignmentCenter; _onLabel.textColor = _textColor; _onLabel.font = _textFont; _onLabel.text = _onText; [_onContentView addSubview:_onLabel]; _offLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _offLabel.backgroundColor = [UIColor clearColor]; _offLabel.textAlignment = NSTextAlignmentCenter; _offLabel.textColor = _textColor; _offLabel.font = _textFont; _offLabel.text = _offText; [_offContentView addSubview:_offLabel]; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapTapGestureRecognizerEvent:)]; [self addGestureRecognizer:tapGesture]; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestureRecognizerEvent:)]; [self addGestureRecognizer:panGesture];}- (CGRect)roundRect:(CGRect)frameOrBounds{ CGRect newRect = frameOrBounds; if (newRect.size.height > ZJSwitchMaxHeight) { newRect.size.height = ZJSwitchMaxHeight; } if (newRect.size.height < ZJSwitchMinHeight) { newRect.size.height = ZJSwitchMinHeight; } if (newRect.size.width < ZJSwitchMinWidth) { newRect.size.width = ZJSwitchMinWidth; } return newRect;}- (void)handleTapTapGestureRecognizerEvent:(UITapGestureRecognizer *)recognizer{ if (recognizer.state == UIGestureRecognizerStateEnded) { [self setOn:!self.isOn animated:YES]; }}- (void)handlePanGestureRecognizerEvent:(UIPanGestureRecognizer *)recognizer{ CGFloat margin = (CGRectGetHeight(self.bounds) - ZJSwitchKnobSize) / 2.0; CGFloat offset = 6.0f; switch (recognizer.state) { case UIGestureRecognizerStateBegan:{ if (!self.isOn) { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(margin, margin, ZJSwitchKnobSize + offset, ZJSwitchKnobSize); }]; } else { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(CGRectGetWidth(self.containerView.bounds) - margin - (ZJSwitchKnobSize + offset), margin, ZJSwitchKnobSize + offset, ZJSwitchKnobSize); }]; } break; } case UIGestureRecognizerStateCancelled: case UIGestureRecognizerStateFailed: { if (!self.isOn) { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(margin, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); }]; } else { [UIView animateWithDuration:0.25 animations:^{ self.knobView.frame = CGRectMake(CGRectGetWidth(self.containerView.bounds) - ZJSwitchKnobSize, margin, ZJSwitchKnobSize, ZJSwitchKnobSize); }]; } break; } case UIGestureRecognizerStateChanged:{ break; } case UIGestureRecognizerStateEnded: [self setOn:!self.isOn animated:YES]; break; case UIGestureRecognizerStatePossible: break; }}@end
#define kSwitchHeight 50- (void)addSwitch{ if (!_switch_forward) { NSString *showText = @"显示名称"; // 2个字 用80比较好看 (18号字体) // 4个字 用120比较好看 (18号字体) // 所以: = 字数 * 20 + 40 CGFloat switchWidth = showText.length * 20 + 40;//120; _switch_showName = [[ZJSwitch alloc] initWithFrame:CGRectMake(0, 0, switchWidth, kSwitchHeight)]; _switch_showName.y = _bottomBtn.y - kSwitchHeight ; _switch_showName.x = self.view.width - 10 - switchWidth ; _switch_showName.backgroundColor = [UIColor clearColor]; _switch_showName.tintColor = [UIColor lightGrayColor]; _switch_showName.onText = showText; _switch_showName.offText = showText; // 也可以不一样 [_switch_showName addTarget:self action:@selector(handleSwitchEvent:) forControlEvents:UIControlEventValueChanged]; [self.scrollView addSubview:_switch_showName]; // >>>>>>>>>>>>>>>>>>>>>>>> showText = @"转发"; // 2个字 用80比较好看 (18号字体) // 4个字 用120比较好看 (18号字体) // 所以: = 字数 * 20 + 40 switchWidth = showText.length * 20 + 40;//120; _switch_forward = [[ZJSwitch alloc] initWithFrame:CGRectMake(0, 0, switchWidth, kSwitchHeight)]; _switch_forward.y = _switch_showName.y - kSwitchHeight ; _switch_forward.x = self.view.width - 10 - switchWidth ; _switch_forward.backgroundColor = [UIColor clearColor]; _switch_forward.tintColor = [UIColor lightGrayColor]; _switch_forward.onText = showText; _switch_forward.offText = showText; // 也可以不一样 _switch_forward.tag = 2048; [_switch_forward addTarget:self action:@selector(handleSwitchEvent:) forControlEvents:UIControlEventValueChanged]; [self.scrollView addSubview:_switch_forward]; }}
1 0
- iOS_带文字的UISwitch
- iOS_绘制带删除线的Label
- iOS_带发光效果的Label
- UISwitch的方法和监听文本框的文字改变
- iOS_文字高度计算
- 带文字的进度条
- 带文字的ImageButton
- 带文字的ImageButton[自定义]
- 带文字的ImageButton[自定义]
- 创建带文字的图片
- ios_设置button上的文字和图片上下垂直居中对齐
- UIswitch 的用法
- UI -- UIswitch 的用法
- UISwitch的使用
- UISwitch的初始化
- UISwitch的详细使用
- UISwitch的使用
- ios的UISwitch
- ios loading视图动画(模仿58同城)
- iOS正则表达式
- 查询Mysql未使用的索引
- Unbutn上搭建android开发环境的简短总结
- Android,iOS,浏览器打开手机QQ与指定用户聊天界面
- iOS_带文字的UISwitch
- Dubbo原理解析
- bzoj1050(最小生成树 并查集)
- 系统属性
- 蓝桥杯 十进制转十六进制
- HDOJ--2014
- 《Android群英传》读书笔记(3)第四章:ListView常用拓展
- POJ-1157 LITTLE SHOP OF FLOWERS(动态规划)
- 【回溯】【leetcode题解】【M】【57】Combination Sum