文档章节

swift实现自定义datePicker,只查询年份和月份

媛美一生
 媛美一生
发布于 2016/06/08 17:09
字数 566
阅读 148
收藏 0

//

//  SDDatePickerView.swift

//  OA

//

//  Created by HelloMac on 16/6/2.

//  Copyright © 2016年 HelloMac. All rights reserved.

//

import UIKit

class SDDatePickerView: UIPickerView,UIPickerViewDelegate,UIPickerViewDataSource {

    var todayIndexPath:NSIndexPath?

    var months:NSArray?

    var years:NSArray?

    var bigRowCount = 1000

    var minYear = 2008

    var maxYear = 2030

    var rowHeight = 44

    var componentNumber:Int = 2

    var MONTH:Int = 0

    var YEAR:Int = 1

    var LABEL_TAG:Int = 43

    //var numberOfComponents: Int

    override func awakeFromNib() {

        super.awakeFromNib()

        self.months = self.nameOfMonths()

        self.years = self.nameOfYears()

        self.todayIndexPath = self.todayPath()

        //设置代理

        self.delegate = self

        self.dataSource = self

        self.selectToday()

    }

    func date() -> NSDate {

        let monthCount:Int = (self.months?.count)!

        let month = self.months?.objectAtIndex((self.selectedRowInComponent(MONTH)) % monthCount) as! String

        let yearCount:Int = (self.years?.count)!

        let year = self.years?.objectAtIndex((self.selectedRowInComponent(YEAR)) % yearCount) as! String

        let str = "\(year)-\(month)"

        let formatter = NSDateFormatter()

        formatter.dateFormat = "yyyy-MMMM"

        let date = formatter.dateFromString(str)

        return date!

    }

    /**

        创建年和月的数据源

     */

    func nameOfMonths() -> NSArray {

        let dateFormatter = NSDateFormatter()

        return dateFormatter.standaloneMonthSymbols

    }

    func nameOfYears() -> NSArray {

        let years = NSMutableArray()

        for year in self.minYear..<self.maxYear {

            let yeatStr = "\(year)"

            years.addObject(yeatStr)

        }

        return years

    }

    /**

        代理方法

    */

    func pickerView(pickerView: UIPickerView, widthForComponent component: Int) -> CGFloat {

        return self.componentWidth()

    }

    func pickerView(pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusingView view: UIView?) -> UIView {

        var selected:Bool = false

        if component == MONTH{

            let monthCount:Int = (self.months?.count)!

            let monthName:String = self.months?.objectAtIndex(row % monthCount) as! String

            let currentMonthName:String = self.currentMonthName()

            if monthName == currentMonthName {

                selected = true

            }

        }else{

            let yearCount:Int = (self.years?.count)!

            let yearName:String = self.years?.objectAtIndex(row % yearCount) as! String

            let currentYearName:String = self.currentYearName()

            if yearName == currentYearName {

                selected = true

            }

        }

        var returnView:UILabel?

        if view?.tag == LABEL_TAG {

            returnView = view as? UILabel

        }else{

            returnView = self.labelForComponent(component, Selected: selected)

        }

        returnView?.textColor = selected ? UIColor.blueColor() : UIColor.blackColor()

        returnView?.text = self.titleForRow(row, forComponent: component)

        return returnView!

    }

    func pickerView(pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {

        return (CGFloat)(rowHeight)

    }

    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {

        return componentNumber

    }

    func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

        if component == MONTH {

            return self.bigRowMonthCount()

        }

        return self.bigRowYearCount()

    }

    func selectToday() {

        self.selectRow(self.todayPath().row, inComponent: MONTH, animated: false)

        self.selectRow(self.todayPath().section, inComponent: YEAR, animated: false)

    }

    func todayPath() -> NSIndexPath {

        //row ==month  section ==year

        var row:Int = 0

        var section:Int = 0

        let currentmonth = self.currentMonthName()

        let currentYear = self.currentYearName()

        let count:Int = (self.months?.count)!

        for month in 0..<count{

            let cellMonth = months![month] as! String

            if cellMonth == currentmonth {

                let currentRow:Int = (self.months?.indexOfObject(cellMonth))!

                row = currentRow

                //let rowCount:Int = self.bigRowMonthCount()/2

                row = row + self.bigRowMonthCount()/2

                break

            }

        }

        let Ycount:Int = (self.years?.count)!

        for year in 0..<Ycount{

            let cellYear = years![year] as! String

            if cellYear == currentYear {

                let currentRow:Int = (self.years?.indexOfObject(cellYear))!

                section = currentRow

               // let rowCount:Int = self.bigRowYearCount()/2

                section = section + self.bigRowYearCount()/2

                break

            }

        }

        return NSIndexPath.init(forRow: row, inSection: section)

    }

    func bigRowMonthCount() -> NSInteger {

        return (self.months?.count)! * bigRowCount

    }

    func bigRowYearCount() -> NSInteger {

        return (self.years?.count)! * bigRowCount

    }

    func componentWidth() -> CGFloat {

        let numberOfComponent:CGFloat = (CGFloat)(self.componentNumber)

        return self.bounds.size.width / numberOfComponent

    }

    func titleForRow(row:Int ,forComponent component:Int) -> String {

        if component == MONTH {

            let monthCount:Int = (self.months?.count)!

            return (self.months?.objectAtIndex(row % monthCount))! as! String

        }

        let  yearCount:Int = (self.years?.count)!

        return (self.years?.objectAtIndex(row % yearCount))! as! String

    }

    func labelForComponent(component:Int , Selected selected:Bool) -> UILabel {

        let frame = CGRectMake(0, 0, self.componentWidth(), (CGFloat)(rowHeight))

        let label = UILabel.init(frame: frame)

        label.textAlignment = NSTextAlignment.Center

        label.backgroundColor = UIColor.clearColor()

        label.textColor = selected ? UIColor.blueColor() : UIColor.blackColor()

        label.font = UIFont.boldSystemFontOfSize(18)

        label.userInteractionEnabled = false

        label.tag = LABEL_TAG

        return label

    }

    func currentMonthName() -> String {

        let date = NSDate()

        let formatter = NSDateFormatter()

        formatter.dateFormat = "MMMM"

        return formatter.stringFromDate(date)

    }

    func currentYearName() -> String {

        let date = NSDate()

        let formatter = NSDateFormatter()

        formatter.dateFormat = "yyyy"

        return formatter.stringFromDate(date)

    }

}

© 著作权归作者所有

媛美一生
粉丝 16
博文 55
码字总数 11281
作品 0
浦东
iOS工程师
私信 提问
JQuery datepicker 使用方法

DatePicker基本使用方法: <!DOCTYPE html><html><head> <link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/> ......

伯洛芒果汁。
2013/03/10
1K
0
Jquery日期、时间选择插件

Jquery日期、时间选择插件 准备工作 首先请到jqueryui.com官网下载datepicker插件代码,注意官网提供了整个jquery ui的所有插件下载,但是您可以选择其中几个用到的插件下载,本文中只用到d...

风中帆
2015/03/06
1K
0
Element-UI 1.0.6 发布,Vue 2.0 的桌面 UI 元素

Element-UI v1.0.6 发布了,Element-UI 是由饿了么公司前端团队开源,是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的组件库,提供了配套设计资源,帮助你的网站快速成型。 更新内容...

王练
2016/12/12
11.8K
23
iOS datePicker

求助:关于datePicker控件,假设我现在选择的是2000年,然后label上出现2000,如何进行操作使得我下一次在选择年份的时候,datePicker显示的是我上次选择的那个年份(这里是2000)?...

xuejingiOS
2015/11/04
98
0
React 组件库 uiw 1.6.0 发布,新增多个功能

uiw 1.6.0 新版发布, 高品质的 UI 工具包,React 的组件库,为打造高品质的 React UI 工具包的理想而奋斗!!! 新功能: 组件Calendar添加月份面板。 b84167d 组件Calendar添加date,mode属性...

同一种调调
2017/12/18
926
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部