亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOs自定義UIView日歷的實現Swift2.1

2019-11-14 18:09:21
字體:
來源:轉載
供稿:網友

學習Swift有一個月了,動手寫一個UIView吧。

所有源代碼在最后,直接用就可以了,第一次寫Swift,和C#,java還是有區別的

(博客園可以考慮在代碼插入中添加Swift的著色了)

1  函數準備。Swift的日歷函數,隨著版本的變化,變動很大。

 

    //MARK: - Calendar    //按照蘋果的習慣,周日放在第一位    let weekdayForDisplay = ["周日","周一","周二","周三","周四","周五","周六"]            //獲取周 周日:1 - 周六:7    func getWeekDay(year:Int,month:Int,day:Int) ->Int{        let dateFormatter:NSDateFormatter = NSDateFormatter();        dateFormatter.dateFormat = "yyyy/MM/dd";        let date:NSDate? = dateFormatter.dateFromString(String(format:"%04d/%02d/%02d",year,month,day));        if date != nil {            let calendar:NSCalendar = NSCalendar.currentCalendar()            let dateComp:NSDateComponents = calendar.components(NSCalendarUnit.NSWeekdayCalendarUnit, fromDate: date!)            return dateComp.weekday;        }        return 0;    }        //這個月的最后一天    //先獲得下個月的第一天,然后在此基礎上減去24小時    //注意這里的時間Debug的時候是UTC    func getLastDay(var year:Int,var month:Int) -> Int?{        let dateFormatter:NSDateFormatter = NSDateFormatter();        dateFormatter.dateFormat = "yyyy/MM/dd";        if month == 12 {            month = 0            year++        }        let targetDate:NSDate? = dateFormatter.dateFromString(String(format:"%04d/%02d/01",year,month+1));        if targetDate != nil {                        let orgDate = NSDate(timeInterval:(24*60*60)*(-1), sinceDate: targetDate!)            let str:String = dateFormatter.stringFromDate(orgDate)            return Int((str as NSString).componentsSeparatedByString("/").last!);        }                return nil;    }

下面是NSDateCompents的一個坑,Swift 1 和 Swift 2 寫法不一樣

        let today = NSDate()        let calendar = NSCalendar(identifier: NSGregorianCalendar)        let comps:NSDateComponents = calendar!.components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day], fromDate: today)

Swift 2 OptionSetType ,比較一下OC和Swift的寫法

 

Objective-C

unsigned unitFlags = NSCalendarUnitYear
                   | NSCalendarUnitMonth
                   | NSCalendarUnitDay
                   | NSCalendarUnitWeekday
                   | NSCalendarUnitHour
                   | NSCalendarUnitMinute
                   | NSCalendarUnitSecond;

Swift2.0

let unitFlags: NSCalendarUnit = [.Year,
                                 .Month,
                                 .Day,
                                 .Weekday,
                                 .Hour,
                                 .Minute,
                                 .Second ]

Swift1.2

let unitFlags: NSCalendarUnit =.CalendarUnitYear
                              | .CalendarUnitMonth
                              | .CalendarUnitDay
                              | .CalendarUnitWeekday
                              | .CalendarUnitHour
                              | .CalendarUnitMinute
                              | .CalendarUnitSecond

 

 

Swift2.0 的語法和1.2有區別  OptionSetType

 

2.接下來就是繪圖,繪圖就是各種被塞爾曲線

重點如下

 

如何居中        let paragraph = NSMutableParagraphStyle()        paragraph.alignment = NSTextAlignment.Center                let text  =  NSMutableAttributedString(string: weekdayForDisplay[i],attributes: [NSParagraphStyleAttributeName: paragraph])        let CellRect = CGRect(x: leftside  , y:padding + mergin, width: WeekdayColumnWidth, height: RowHeight)        text.drawInRect(CellRect)紅字粗體        text.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(),range:NSMakeRange(0,text.length))        text.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(NSDefaultFontSize),range:NSMakeRange(0,text.length))

 

3.接下來是如何捕獲點擊事件

由于是全手工繪制日歷的格子,所以,就用OnTouchBegan事件的屬性獲得點擊位置,根據位置得知被按下的區域隸屬于哪個日子。

    //記錄每天的格子的Rect    var DayRect = [Int:CGRect]()            override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        let SignleTouch = touches.first!        let Touchpoint = SignleTouch.locationInView(self)        let pick = getDayByTouchPoint(Touchpoint)        PRint("TouchPoint : X = /(Touchpoint.x) Y = /(Touchpoint.y)  Day: /(pick)")                if pick != 0 {self.PickedDay = pick }    }        //根據觸摸點獲取日期    func getDayByTouchPoint(touchpoint:CGPoint) -> Int {        for day in DayRect{            if day.1.contains(touchpoint){                return day.0            }        }        return 0    }

 

最終效果如下圖,可以實現點擊選擇日期。整個代碼,8個小時可以完成。

現在的問題是,如果選擇的日子變化了,我不知道怎么告訴上層的 ViewController,SelectDateChanged。

如果可以的話,最好能夠出現 ActionConnection,可以拖曳連線,將Action和代碼綁定。誰知道怎么做嗎?

////  CalendarView.swift//  PlanAndTarget////  Created by  scs on 15/10/13.//  Copyright © 2015年  scs. All rights reserved.//import UIKit@IBDesignableclass CalendarView: UIView {    //MARK: - Inspectable    @IBInspectable    var CurrentYear : Int = 2015{        didSet{            if self.CurrentYear < 0 {                self.CurrentYear = 2015            }            setNeedsDisplay()        }    }        @IBInspectable    var CurrentMonth : Int = 10 {        didSet{            if self.CurrentMonth < 0 || self.CurrentMonth > 12 {                self.CurrentMonth = 1            }            setNeedsDisplay()        }    }        @IBInspectable    var padding : CGFloat = 4 {        didSet{            if (self.padding > 50 ) {                self.padding = 50            }            setNeedsDisplay()        }    }        @IBInspectable    var mergin : CGFloat = 4 {        didSet{            if (self.mergin > 50 ) {                self.mergin = 50            }            setNeedsDisplay()        }    }        @IBInspectable    var RowHeight : CGFloat = 20{        didSet{            if (self.RowHeight > 100 ) {                self.RowHeight = 100            }            setNeedsDisplay()        }    }        @IBInspectable    var PickedDay : Int = 1 {        didSet{            if (self.PickedDay < 0){                self.PickedDay = 1            }            let lastDay = getLastDay( CurrentYear, month: CurrentMonth)            if (self.PickedDay > lastDay!){                self.PickedDay = lastDay!            }            setNeedsDisplay()        }    }                    //MARK: - Calendar    //按照蘋果的習慣,周日放在第一位    let weekdayForDisplay = ["周日","周一","周二","周三","周四","周五","周六"]            //獲取周 周日:1 - 周六:7    func getWeekDay(year:Int,month:Int,day:Int) ->Int{        let dateFormatter:NSDateFormatter = NSDateFormatter();        dateFormatter.dateFormat = "yyyy/MM/dd";        let date:NSDate? = dateFormatter.dateFromString(String(format:"%04d/%02d/%02d",year,month,day));        if date != nil {            let calendar:NSCalendar = NSCalendar.currentCalendar()            let dateComp:NSDateComponents = calendar.components(NSCalendarUnit.NSWeekdayCalendarUnit, fromDate: date!)            return dateComp.weekday;        }        return 0;    }        //這個月的最后一天    //先獲得下個月的第一天,然后在此基礎上減去24小時    //注意這里的時間Debug的時候是UTC    func getLastDay(var year:Int,var month:Int) -> Int?{        let dateFormatter:NSDateFormatter = NSDateFormatter();        dateFormatter.dateFormat = "yyyy/MM/dd";        if month == 12 {            month = 0            year++        }        let targetDate:NSDate? = dateFormatter.dateFromString(String(format:"%04d/%02d/01",year,month+1));        if targetDate != nil {                        let orgDate = NSDate(timeInterval:(24*60*60)*(-1), sinceDate: targetDate!)            let str:String = dateFormatter.stringFromDate(orgDate)            return Int((str as NSString).componentsSeparatedByString("/").last!);        }                return nil;    }        //MARK: - Event    //記錄每天的格子的Rect    var DayRect = [Int:CGRect]()            override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        let SignleTouch = touches.first!        let Touchpoint = SignleTouch.locationInView(self)        let pick = getDayByTouchPoint(Touchpoint)        print("TouchPoint : X = /(Touchpoint.x) Y = /(Touchpoint.y)  Day: /(pick)")                if pick != 0 {self.PickedDay = pick }    }        //根據觸摸點獲取日期    func getDayByTouchPoint(touchpoint:CGPoint) -> Int {        for day in DayRect{            if day.1.contains(touchpoint){                return day.0            }        }        return 0    }            // Only override drawRect: if you perform custom drawing.    // An empty implementation adversely affects performance during animation.    override func drawRect(rect: CGRect) {                let paragraph = NSMutableParagraphStyle()        paragraph.alignment = NSTextAlignment.Center        //查資料可知默認字體為12        let NSDefaultFontSize : CGFloat = 12;                //繪制表頭        let UseableWidth :CGFloat = rect.width - (padding + mergin) * 2;        let WeekdayColumnWidth : CGFloat = UseableWidth / 7        var leftside  : CGFloat = padding + mergin        for i in 0...6{            let text  =  NSMutableAttributedString(string: weekdayForDisplay[i],attributes: [NSParagraphStyleAttributeName: paragraph])            let CellRect = CGRect(x: leftside  , y:padding + mergin, width: WeekdayColumnWidth, height: RowHeight)            text.drawInRect(CellRect)            leftside += WeekdayColumnWidth        }                //繪制當月每天        var rowCount = 1;        leftside  = padding + mergin        let today = NSDate()        let calendar = NSCalendar(identifier: NSGregorianCalendar)        let comps:NSDateComponents = calendar!.components([NSCalendarUnit.Year,NSCalendarUnit.Month,NSCalendarUnit.Day], fromDate: today)                //Clear        DayRect.removeAll()                for day in 1...getLastDay(CurrentYear,month:CurrentMonth)!{            let weekday = getWeekDay(CurrentYear, month: CurrentMonth, day: day)            let text  =  NSMutableAttributedString(string: String(day),  attributes: [NSParagraphStyleAttributeName: paragraph])            let LeftTopX = leftside + CGFloat(weekday - 1) * WeekdayColumnWidth            let LeftTopY = padding + mergin + RowHeight * CGFloat(rowCount)            let CellRect :CGRect = CGRect(x: LeftTopX, y: LeftTopY, width: WeekdayColumnWidth, height: RowHeight)            if (PickedDay == day){                //選中的日子,UI效果                let PickRectPath = UIBezierPath(roundedRect: CellRect, cornerRadius: RowHeight/2)                UIColor.blueColor().colorWithAlphaComponent(0.3).setFill()                PickRectPath.fill()            }                        if (comps.year == CurrentYear && comps.month == CurrentMonth && comps.day == day){                text.addAttribute(NSForegroundColorAttributeName, value: UIColor.redColor(),range:NSMakeRange(0,text.length))                text.addAttribute(NSFontAttributeName, value: UIFont.boldSystemFontOfSize(NSDefaultFontSize),range:NSMakeRange(0,text.length))            }                                    text.drawInRect(CellRect)            DayRect[day] = CellRect            //繪制了周日之后,需要新的一行            if weekday == 7 { rowCount++ }        }                //繪制外框        let path : UIBezierPath = UIBezierPath(rect: CGRect(x: padding, y: padding, width: rect.width - padding * 2 , height: padding + mergin + RowHeight * CGFloat(rowCount - 1) + 10 ))        path.stroke()                //path = UIBezierPath(rect: CGRect(x: padding + mergin, y: padding + mergin, width: rect.width - (padding + mergin) * 2 , height: rect.height - (padding + mergin) * 2))        //path.stroke()                print("LastDay Of 2015/10 : /(getLastDay(CurrentYear, month: CurrentMonth))" )        print("2015/10/18 : /(weekdayForDisplay[getWeekDay(CurrentYear, month: CurrentMonth, day: 18) - 1]  )" )        print("Calendar Size Height: /(rect.height)  Width: /(rect.width)" )    }            }

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文国产成人精品久久一| 欧美日韩高清在线观看| 美女啪啪无遮挡免费久久网站| 国产精品福利片| 日韩av一区在线观看| 在线观看免费高清视频97| 亚洲日本成人女熟在线观看| 中文字幕精品一区二区精品| 亚洲一级一级97网| 日本久久久久久久久| 亚洲大胆人体av| 福利一区视频在线观看| 日本成人黄色片| 一区二区欧美亚洲| 亚洲黄色av女优在线观看| 亚洲激情在线观看视频免费| 日韩成人av网| 亚洲国产精品久久久| 国产精品久久久久久久9999| 粉嫩老牛aⅴ一区二区三区| 日韩高清电影免费观看完整| 亚洲精品视频中文字幕| 91亚洲精品在线观看| 色播久久人人爽人人爽人人片视av| 91在线色戒在线| 日韩va亚洲va欧洲va国产| 中文字幕亚洲国产| 97免费视频在线| 亚洲国产成人精品一区二区| 亚洲精品第一页| 92看片淫黄大片看国产片| 91在线免费视频| 黑人巨大精品欧美一区二区三区| xvideos亚洲人网站| 亚洲成人久久久| 在线激情影院一区| 欧美专区第一页| 国产精品美女久久久免费| 国产欧美一区二区三区久久人妖| 日韩美女免费线视频| 日韩av三级在线观看| 日韩精品免费在线| 久久电影一区二区| 在线成人激情视频| 成人精品一区二区三区| 一区二区三区无码高清视频| 欧美性猛交视频| 欧美日韩在线看| 久久99国产综合精品女同| 久久精品国产欧美激情| 性日韩欧美在线视频| 欧美香蕉大胸在线视频观看| 亚洲大胆人体视频| 欧洲永久精品大片ww免费漫画| 久久视频在线播放| 成人av.网址在线网站| 日韩中文字幕在线观看| 日韩欧美极品在线观看| 精品久久久久久中文字幕| 在线观看欧美www| 久久久亚洲影院你懂的| 久久久久亚洲精品成人网小说| 成人性生交大片免费观看嘿嘿视频| 久久欧美在线电影| 国产精品情侣自拍| 精品国产乱码久久久久久虫虫漫画| 欧美二区乱c黑人| 色综合伊人色综合网| 成人在线小视频| 亚洲男人av在线| 亚洲人成啪啪网站| 日韩美女在线看| 91亚洲精品在线观看| 久久精品免费播放| 欧美日韩在线一区| 亚洲国产一区自拍| 国产精品丝袜久久久久久高清| 欧美日韩高清区| 92福利视频午夜1000合集在线观看| 亚洲精品视频在线观看视频| 亚洲激情视频在线播放| 岛国精品视频在线播放| 欧美日韩免费一区| 色婷婷久久一区二区| 国产精自产拍久久久久久蜜| 精品久久久免费| 国产婷婷成人久久av免费高清| 91午夜理伦私人影院| 国产日韩中文在线| 尤物九九久久国产精品的特点| 狠狠躁夜夜躁人人躁婷婷91| 久久久精品免费视频| 日韩国产精品视频| 国产精品青青在线观看爽香蕉| 国产伦精品免费视频| 亚洲va欧美va国产综合剧情| 亚洲精品国产精品自产a区红杏吧| 欧美性xxxx18| 性欧美暴力猛交69hd| 成人久久一区二区三区| 亚洲v日韩v综合v精品v| 精品日韩美女的视频高清| 久久精品国产一区| 亚洲已满18点击进入在线看片| 久久精品一偷一偷国产| 欧美wwwwww| 国产欧美日韩专区发布| 精品国偷自产在线视频99| 超碰97人人做人人爱少妇| 97香蕉超级碰碰久久免费的优势| 欧美黑人一级爽快片淫片高清| 久久久久久久爱| 一道本无吗dⅴd在线播放一区| 久久久国产成人精品| 清纯唯美日韩制服另类| 日韩电影中文字幕av| 97欧美精品一区二区三区| 亚洲精品国产成人| 久久久久久免费精品| 国产精品欧美久久久| 狠狠色香婷婷久久亚洲精品| 欧美久久精品午夜青青大伊人| 亚洲色图15p| 亚洲色图激情小说| 欧美高清videos高潮hd| 国产精品白丝jk喷水视频一区| 日韩福利在线播放| 亚洲美女福利视频网站| 亚洲精品国产精品国自产在线| 日韩av电影手机在线观看| 亚洲黄色成人网| 免费av一区二区| 欧美激情在线一区| 国产一区二区免费| 91午夜在线播放| 国产视频精品在线| 在线日韩中文字幕| 久久躁狠狠躁夜夜爽| 成人午夜黄色影院| 尤物精品国产第一福利三区| 日韩在线视频播放| 久久久免费观看视频| 中文字幕av一区二区| 国产日韩在线播放| 亚洲男女性事视频| 亚洲成人三级在线| 亚洲成avwww人| 国产精品视频大全| 国产视频综合在线| 日韩精品免费综合视频在线播放| 97色在线播放视频| 91香蕉嫩草影院入口| 亚洲国产高清福利视频| 欧美精品成人在线| 欧美激情免费看| 激情成人中文字幕| 成人网页在线免费观看| 亚洲欧美制服第一页| 成人午夜一级二级三级| 国产亚洲视频在线观看| 欧美亚洲另类激情另类| 国产成人91久久精品| 精品国产91久久久久久| 欧美电影在线观看|