文档章节

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

媛美一生
 媛美一生
发布于 2016/06/08 17:09
字数 566
阅读 27
收藏 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
0
0
Jquery日期、时间选择插件

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

风中帆
2015/03/06
0
0
iView v3.1.2 发布,基于 Vue.js 的高质量 UI 组件库

iView v3.1.2 发布了,iView 是一套基于 Vue.js 的高质量 UI 组件库,主要服务于 PC 界面的中后台产品。 这是一个 bug 修复版本: 修复 DatePicker 在 split-panels 模式下,有时报错的问题。...

局长
09/28
0
0
时间与日期选择器——Mars Android开发视频之第一季第十六集(重)

1· TimePicker的使用方法 TimePicker的样子(4.2版本): 下面,我们来添加一个TimePicker: 这样,就添加上了: 1.1 获取用户选择的时间: 声明成员变量: 接着获取这个控件: 然后实现Tim...

周田
2015/08/21
0
0
[非凡程序员]手写UIDatePicker和UIPickerView

// // ViewController.h // 手写UIDatePicker // // Created by 非凡 程序员 on 15/11/13. // Copyright (c) 2015年 非凡 程序员. All rights reserved. // #import <UIKit/UIKit.h> @interf......

温暖c
2015/11/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
30分钟前
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
49分钟前
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
今天
1
0
【分享实录】BANCOR算法详解及代码实现

1 活动基本信息 1)主题:【区块链技术工坊22期】BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何开发自己的BANCOR去中心...

HiBlock
今天
2
0
微信小程序(2)

开始看微信小程序的教程了。刚刚看完官方教程的视图层部分。这里摘录一些自己认为的部分关键点。 1.直接修改数值无法重新渲染,需要使用setData()方法; 2.列表渲染中:wx:key用于保持项目在...

MKjy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部