自定义一个简单的SegmentedControl
先大概看下我们想实现简单的效果
源码
//
// DSegmentedControl.swift
// IOS学习之自定义UISegmentedControl
//
// Created by ding_qili on 16/9/12.
// Copyright © 2016年 ding_qili. All rights reserved.
//
import UIKit
@IBDesignable class DSegmentedControl: UIControl {
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect) {
// Drawing code
}
*/
var titleColor:UIColor = UIColor.gray //选择状态
var titleColorDisable:UIColor = UIColor.darkGray //未选中状态
let slide = CALayer() //滑块
@IBInspectable var titles:[String]{ //标题
didSet{
guard titles.count > 0 else {
return
}
for title in 0..<titles.count {
let label = UIButton();
label.setTitle(titles[title], for: UIControlState());
label.setTitleColor(titleColor, for: UIControlState.disabled)
label.setTitleColor(titleColorDisable, for: UIControlState())
label.addTarget(self, action: #selector(changeValue), for: UIControlEvents.touchUpInside);
self.addSubview(label);
}
setNeedsLayout()
}
}
override func tintColorDidChange() {
super.tintColorDidChange()
}
var selecteIndex:Int = 0 {
didSet{
refrushSubView()
}
}
override init(frame: CGRect) {
titles = []
super.init(frame: frame)
finishInit()
}
requi 大专栏 自定义一个简单的SegmentedControlred init?(coder aDecoder: NSCoder) {
titles = []
super.init(coder: aDecoder)
finishInit()
}
func changeValue(_ sender:UIView){
if let index = self.subviews.index(of: sender){
selecteIndex = index;
self.sendActions(for: UIControlEvents.valueChanged)
}
}
func finishInit(){
titleColor = self.tintColor
slide.frame = CGRect(x: 0, y: 0, width: self.frame.width/2, height: 1)
slide.backgroundColor = titleColor.cgColor
self.layer.addSublayer(slide)
self.backgroundColor = UIColor.clear
}
override func layoutSubviews() {
super.layoutSubviews()
refrushSubView()
}
func refrushSubView(){
for item in self.subviews.enumerated() {
item.element.frame = CGRect(x: self.frame.width/CGFloat(titles.count) * CGFloat(item.offset), y: 0, width: self.frame.width/CGFloat(titles.count), height: self.frame.height)
if selecteIndex == item.offset{
var center = item.element.center;
center.y = self.frame.height;
slide.position = center;
}
if let uIControl = item.element as? UIControl {
uIControl.isEnabled = (selecteIndex != item.offset);
}
}
}
}
1. 选择继承UIControl,是想要通过UIControlEvents.valueChanged的方式来通知调用者切换状态
2. 默认是用了TintColor作为主色调来使用
3. `segment.titles = ["简介","评论"]` 就可以使用了
4. `segment.addTarget(self, action: #selector(segmentValueChange), for: UIControlEvents.valueChanged)` 回调选择切换
5. 代码比较简单,用于简单的学习
自定义一个简单的SegmentedControl的更多相关文章
- 自定义一个简单的JDBC连接池
一.什么是JDBC连接池? 在传统的JDBC连接中,每次获得一个Connection连接都需要加载通过一些繁杂的代码去获取,例如以下代码: public static Connection getCo ...
- Struts—自定义一个简单的mystruct
传统mvc开发总结: 1. 跳转代码写死,不灵活 2. 每次都去写servlet,web.xml中配置servlet! (配置目的: 请求, Servlet处理类) 一个简单的struct案例,描述如 ...
- 用C#自定义一个简单的集合
闲来无聊来自己做了一个简单的'集合',用来加深自己对集合的理解 class listNode { private object value; public listNode(object _value ...
- 代码调试--自定义一个简单的debug函数
function debug(){ $num_args = func_num_args(); //实参个数 $arg_list = func_get_args(); //返回某一个实参,必须是实参数组 ...
- 自定义一个简单的web框架
from wsgiref.simple_server import make_server def book(request): #视图函数 return [b'<h1> book ...
- [安卓] 18、一个简单的例子做自定义动画按钮和自定义Actionbar
在做安卓UI的时候有时候需自定义具有动画效果的按钮或需要自定义一下actionbar~ 本节用一个简单的demo讲如何自定义具有动画效果的按钮,以及个性化的actionbar 下面是效果: 其中: △ ...
- ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布局
本文转自 :http://www.cnblogs.com/wendingding/p/3761730.html ios开发UI篇—使用纯代码自定义UItableviewcell实现一个简单的微博界面布 ...
- iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局
iOS开发UI篇—使用xib自定义UItableviewcell实现一个简单的团购应用界面布局 一.项目文件结构和plist文件 二.实现效果 三.代码示例 1.没有使用配套的类,而是直接使用xib文 ...
- 一个简单的jsp自定义标签
学到了一个简单的jsp自定义标签,后面有更多的例子,会更新出来: 例子1: 步骤: 1.编写标签实现类: 继承javax.servlet.jsp.tagext.SimpleTagSupport; 重写 ...
随机推荐
- java线程——notifyAll通知的泄露
版权声明:本文为CSDN博主「兰亭风雨」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/ns_code/ar ...
- 同时运行两个版本相同的tomcat
由于项目需要,代理集群和一个节点都部署在本地,那么就需要有两个tomcat,一个部署集群,一个部署项目,我都用了7.0.34版本的tomcat 当启动代理的tomcat成功时,再启动节点的tomcat ...
- 65)STL中string的知识
1)代码展示: string是一个类,只不过封装了 char* 而且还封装了 很多的字符串操作函数 2)string类的初始化: string的构造函数 ² 默认构造函数: string(); ...
- 吴裕雄--天生自然 PHP开发学习:多维数组
<pre> <?php // 二维数组: $cars = array ( array("Volvo",100,96), array("BMW" ...
- 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制
spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...
- PHP实现快速排序算法相关案例
<?php /** * 快速排序 --主要运用递归, 先把一个数找准位置,然后再递归把左右两边的数都找准位置 */ function QSort($a= []){ $nCount = count ...
- IT架构的本质--阅读笔记01
万物都有其本质,也只有了解了事物的本质之后,才不至于出现在事物稍作改变时就难以应对的情况,作为软件工程专业的学生,我们应该对IT架构的本质有一定的了解.“老僧三十年前未参禅时,见山是山,见水是水.及至 ...
- Java之线程通信的方法
/** * 线程通信的例子:使用两个线程打印 1-100.线程1, 线程2 交替打印 * * 涉及到的三个方法: * wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. * no ...
- 模板编程里class 与 typename 的区别
大部分情况下可以相互替换,但是某些情况class 无法替代typename,例如 template< class T, class U > std::shared_ptr<T> ...
- 解决 nginx 启动错误 nginx: [emerg] host not found in upstream
解决办法来自于:https://blog.csdn.net/Hreticent/article/details/86074502 感谢这个朋友简单而清晰的解决办法. 在配置nginx支持PHP的时候, ...
