网上搜了一下,基本都是讲的如何自定义UISwitch控件。我今天来写一篇如何不更改(或最少的更改)原有工程里各个类关于UISwitch的声明、设置、调用代码,平滑的将系统UISwitch样式大小更改为客户需要求展示的样式。

看一下系统的UISwitch的展示效果

系统的UISwitch的提供的属性和方法:

方法很少,能让开发者修改的地方也很少:

1.frame是修改不了的

2.通过动画的方式可以放大缩小实现改变大小的效果,但是里面圆圈和外部的比例还是变不了

3.圆圈的颜色无法改变

为了将工程中所有用到这个控件的地方都改变其展示样式,

1.需要自定义一个控件,采用 UIImageView + UIButton的方式,UIImageView展示的是类似椭圆形图片,UIButton是上面的圆圈。通过点击button用动画来移动位置并更改背景图。

2.需要实现的方法和声明的属性(和系统的基本一致)

@property(nullable, nonatomic, strong) UIColor *onTintColor;

//@property(nullable, nonatomic, strong) UIColor *thumbTintColor;

@property(nonatomic,getter=isOn) BOOL on;

- (instancetype)init;

- (void)setOn:(BOOL)on animated:(BOOL)animated;

3.在pch文件 加上

#import "PublicSwitchView.h"
#define UISwitch PublicSwitchView

4.实现原理:通过写和系统一样的方法名来达到只更改类名的效果,通过宏定义一次更换所有地方的类名。

具体代码

//
//  PublicSwitchView.h
//  Demo
//
//  Created by yfc on 2017/10/14.
//  Copyright © 2017年 yfc. All rights reserved.
//#import <UIKit/UIKit.h>@interface PublicSwitchView : UIControl{UIImageView *imageview;UIButton *btn;
}
@property(nullable, nonatomic, strong) UIColor *onTintColor;
//@property(nullable, nonatomic, strong) UIColor *thumbTintColor;
@property(nonatomic,getter=isOn) BOOL on;
- (void)setOn:(BOOL)on animated:(BOOL)animated;
@end
//
//  PublicSwitchView.m
//  Demo
//
//  Created by yfc on 2017/10/14.
//  Copyright © 2017年 yfc. All rights reserved.
//#import "PublicSwitchView.h"
#import "UIView+Utils.h"@implementation PublicSwitchView- (instancetype)init{CGRect frame = CGRectMake(0, 0, 50, 25);if (self = [super initWithFrame:frame]) {self.backgroundColor = [UIColor clearColor];////椭圆背景//imageview = [[UIImageView alloc]initWithFrame:frame];imageview.image = [UIImage imageNamed:@"graySwitch"];[self addSubview:imageview];////圆圈//double height = frame.size.height - 7;btn = [[UIButton alloc]initWithFrame:CGRectMake(5, 0, height, height)];btn.layer.cornerRadius = btn.width / 2.0;btn.backgroundColor = [UIColor whiteColor];[btn addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];btn.centerY = frame.size.height / 2.0;btn.userInteractionEnabled = YES;[self addSubview:btn];[self addTarget:self action:@selector(btnClicked:) forControlEvents:UIControlEventTouchUpInside];self.userInteractionEnabled = YES;}return self;}//
//大小固定
//
- (void)setFrame:(CGRect)frame{CGRect frame_ = CGRectMake(frame.origin.x, frame.origin.y, 50, 25);[super setFrame:frame_];
}
//
//点击事件
//
- (void)btnClicked:(UIButton *)btneee{[UIView animateWithDuration:0.25 animations:^{if (btn.left < 6) {btn.right = self.frame.size.width - 5;self.on = YES;imageview.image = [UIImage imageNamed:@"purpleSwitch"];////发送点击事件//[self sendActionsForControlEvents:UIControlEventValueChanged];}else{btn.left = 5;imageview.image = [UIImage imageNamed:@"graySwitch"];self.on = NO;////发送点击事件//[self sendActionsForControlEvents:UIControlEventValueChanged];}}];}
//
//带有动画的设置开关状态
//
- (void)setOn:(BOOL)on{_on = on;[UIView animateWithDuration:0.25 animations:^{if (on == YES) {btn.right = self.frame.size.width - 5;imageview.image = [UIImage imageNamed:@"purpleSwitch"];}else{btn.left = 5;imageview.image = [UIImage imageNamed:@"graySwitch"];}}];
}
//
//设置不可点击
//
- (void)setEnabled:(BOOL)enabled{[super setEnabled:enabled];if (enabled == NO) {[self setOn:NO animated:NO];imageview.image = [UIImage imageNamed:@"enabledSwitch"];btn.backgroundColor = [UIColor colorWithRed:254/255.0 green:255/255.0 blue:255/255.0 alpha:1];}}
//
//是否带有动画的设置开关状态
//
- (void)setOn:(BOOL)on animated:(BOOL)animated;{if (animated == YES) {self.on = on;}else{_on = on;if (on == YES) {btn.right = self.frame.size.width - 5;imageview.image = [UIImage imageNamed:@"purpleSwitch"];}else{btn.left = 5;imageview.image = [UIImage imageNamed:@"graySwitch"];}}}
- (void)dealloc{}
@end

下面是效果图

最后:如果需求变化,又要使用系统的样式:屏蔽掉两句话即可

如何更改工程内最少的代码修改系统UISwitch的大小和样式相关推荐

  1. 高通Android 12/13修改系统电池容量大小

    1.修改 qssi11/vendor/qcom/proprietary/commonsys-intf/resource-overlay/bengal/Frameworks/res/xml/power_ ...

  2. 怎么更改计算机管理员的用户名,如何修改系统默认账户administrator

    windows系统都会有几个默认账户,如administrator表示默认的管理员,guest表示默认的来宾用户.下面就让学习啦小编教大家如何修改系统默认账户administrator吧. 修改系统默 ...

  3. win10更改计算机属性,Win10电脑怎么修改系统字体?详细更改教程请看这里!

    在平时的日常生活当中,无论是使用手机玩耍,还是使用电脑工作,很多小伙伴都会默认使用手机或电脑上的字体.但是在长期的使用下,默认字体跟默认壁纸一样,会越看越觉得不喜欢了. 就比如说win10系统电脑的默 ...

  4. Android 屏幕适配(修改系统字体大小、显示大小、修改分辨率相关适配)

    Android实际开发中会遇到各种各样的机型,所以就需要对多种机型进行适配.常见的适配在这类就不详细介绍了,大家可以参考这里的系列文章Android通用屏幕适配讲解的已经很详细了.下面说的是:当修改系 ...

  5. 更改计算机属性里的cpu名称,一行代码修改CPU的个性化显示名称,

    一行代码修改CPU的个性化显示名称, 2020-10-01 14:06:40 55点赞 334收藏 52评论 追加修改(2020-10-04 21:39:32): 代码修改 REG ADD " ...

  6. html的div修改字体,div字体大小_div内文字大小改变css代码

    控制div内文字字体大小,其实非常简单,一个CSS样式即可实现,字体大小均能根据需求自由设置.不同div内字体大小根据需求也可用自由改变. 一.字体大小CSS样式 font-size 用法: p{fo ...

  7. 提高C++性能的编程技术笔记:内联+测试代码

    内联类似于宏,在调用方法内部展开被调用方法,以此来代替方法的调用.一般来说表达内联意图的方式有两种:一种是在定义方法时添加内联保留字的前缀:另一种是在类的头部声明中定义方法. 虽然内联方法的调用方式和 ...

  8. Xcode 修改系统的代码块样式 Code Snippet

    Xcode在编码的时候,系统代码块给我们提供了很大的便利.然而,有时候,也给我们带来很大的困扰. 例如,系统的 if 代码块,大括号是紧跟括号之后的.    但是现在呢,公司的代码规范是要求另起一行. ...

  9. UE4 更改工程文件名字的方法

    ** UE4 更改工程文件名字的方法 ** 背景: 我们在日常开发中, 经常会使用上一个工程的一些原始工程文件,此时我们需要将原始的工程文件进行重新命名. 废话少说, 上步骤: 这是我们原始的工程文件 ...

最新文章

  1. 深度 | 推荐系统评估
  2. 端口基础常识大全+常用端口对照
  3. maven java jar_在maven中引入本地jar包的方法
  4. LeetCode Ransom Note(字符串)
  5. oracle查询指定行数间的记录
  6. 成功解决TypeError: Singleton array array('data_input/xgboost/data_RentListingInquries/RentListingInqurie
  7. CYQ.Data V5 MDataTable 专属篇介绍
  8. JAVA Web Servlet中的异步处理 (1) -- Servlet3.0中的Async支持
  9. Prometheus学习
  10. layer模态窗简单使用
  11. 剑指offer——5.替换空格
  12. centos java进程号_centos中分析java占用大量CPU资源的原因
  13. 基于sklearn的西瓜数据集的SVR回归实现
  14. 配合python的rich库实现高颜值LOL服务器状态查询
  15. 微信新年祝福php代码,微信版新年祝福语
  16. 文件服务器和nas区别,nas和ftp服务器的区别
  17. 【物联家居】第四章:传输协议--mqtt配置与测试
  18. 苏州市区公积金与园区公积金新政策-乙类对比 (包括住房公积金)
  19. Oracle报错:不是单组分组函数解决
  20. ISTQB- TTA大纲

热门文章

  1. 12.23网络嗅探实验记录
  2. watch事件监听三种写法
  3. 斯帅:没料到詹姆斯会耗光时间再投
  4. 通达信手机版分时图指标大全_通达信精选指标——主力潜伏中优化版
  5. 14-《ARKit by Tutorials》读书笔记1:开始入门
  6. 2020元旦献礼——从零开始开发一个操作系统
  7. 如何学习大型项目的源码?
  8. rem 与 px 换算关系
  9. 数据类型与堆栈内存练习数据类型检测
  10. OpenNLP进行自然语言处理