自定义一个简单的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; 重写 ... 
随机推荐
- JS面向对象,原型,继承
			ECMAScript有两种开发模式:1.函数式(过程化),2.面向对象(OOP).面向对象的语言有一个标志,那就是类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.但是,ECMAScript ... 
- android设备内部添加apn信息
			由于工作原因今天需要给多台android设备中写入某张sim卡的apn相关信息,虽然可以通过sqlite命令写sql语句来写入到设备中,但设备一多起来就太低效了,所以在学习的过程中摸索着写了一个将ap ... 
- luffy项目:基于vue与drf前后台分离项目(1)
			""" 1.业务逻辑:登录注册 - 主页(基础信息展示) - 课程页(复杂信息展示)- 课程订单生产与支付 - 上线订单生成 2.实际项目开发的技术点: git版本控制 ... 
- [mark]C# 异常处理
			https://docs.microsoft.com/zh-cn/dotnet/articles/csharp/programming-guide/exceptions/index 
- Linux-waitpid介绍
			1.waitpid与wait差别 (1).基本功能是一样的,都是用来回收子进程 (2).waitpid可以回收指定PID的子进程 (3).waitpid可以阻塞式或非阻塞式两种工作模式 2.代码示例 ... 
- Linux进程的引入
			1.什么是进程? (1).进程是一个动态过程而不是静态实物 (2).进程就是程序的一次运行过程,一个静态的可执行程序a.out的一次运行过程(./a.out从运行到结束)就是一个进程. (3).进程控 ... 
- js 经纬度计算直线距离
			function getRad(d) { var PI = Math.PI; return d * PI / 180.0; } function getDistance(lat1, lng1, lat ... 
- .net EasyTree显示所级层级(无限级、整层级颗树)的另类写法。非递归
			获取整颗树的另类写法.非递归 //获取所有的菜单 List<T_Menu> menu = bll.getMenuByUsesrID("8189a7c1-6f15-4744-b6c ... 
- Java的各类型数据在内存中分配情况详解
			1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ... 
- IMX6开发板qt creator直接编译ARM架构程序
			除了通过 11.2.2 小节通过命令行的操作来编译在 iTOP-imx6 开发板上运行的程序,还可以直接在 qtcreator 上设置,然后每次编译的程序都可以在开发板上运行.如下图所示,打开 qtc ... 
 
			
		