[Swift通天遁地]1、超級工具-(17)自定義的CVCalendar日曆

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-athmtxcc-hx.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

目錄:[Swift]通天遁地Swiftios

本文將演示另外一款第三方的日曆類庫。git

首先確保在項目中已經安裝了所需的第三方庫。github

點擊【Podfile】,查看安裝配置文件。swift

1 platform :ios, '12.0'
2 use_frameworks!
3 
4 target 'DemoApp' do
5     source 'https://github.com/CocoaPods/Specs.git'
6     pod 'CVCalendar', '~> 1.4.0'
7 end

根據配置文件中的相關配置,安裝第三方庫。數組

而後點擊打開【DemoApp.xcworkspace】項目文件。微信

在項目導航區,打開視圖控制器的代碼文件【ViewController.swift】dom

選擇開始編寫代碼,建立一個日曆控件。ide

  1 import UIKit
  2 //在當前類文件中,引入已經安裝的第三方類庫
  3 import CVCalendar
  4 
  5 class ViewController: UIViewController {
  6 
  7     //添加一個日曆菜單視圖變量,做爲當前類的一個屬性。
  8     //日曆菜單將位於日曆視圖的上方,用來顯示日曆的星期。
  9     var menuView : CVCalendarMenuView!
 10     //添加一個日曆視圖變量,做爲當前類的一個屬性
 11     var calendarView : CVCalendarView!
 12     
 13     override func viewDidLoad() {
 14         super.viewDidLoad()
 15         // Do any additional setup after loading the view, typically from a nib.
 16         
 17         //設置當前根視圖的背景顏色
 18         self.view.backgroundColor = UIColor(red: 239.0/255, green: 239.0/255, blue: 239.0/255, alpha: 1.0)
 19         
 20         //對日曆菜單視圖,進行初始化操做,並設置其顯示區域位於屏幕上方。
 21         self.menuView = CVCalendarMenuView(frame: CGRect(x: 20, y: 40, width: 280, height: 15))
 22         
 23         //對日曆視圖進行初始化操做,並設置其顯示區域
 24         self.calendarView = CVCalendarView(frame: CGRect(x: 20, y: 60, width: 280, height: 320))
 25         
 26         //設置日曆視圖的外觀代理爲當前的視圖控制器對象
 27         self.calendarView.calendarAppearanceDelegate = self
 28         //設置日曆視圖的日曆代理爲當前的視圖控制器對象
 29         self.calendarView.calendarDelegate = self
 30         //設置日曆視圖的動畫代理爲當前的視圖控制器對象
 31         self.calendarView.animatorDelegate = self
 32 
 33         //設置日曆菜單視圖的菜單代理爲當前視圖控制器對象
 34         self.menuView.menuViewDelegate = self
 35         
 36         //依次將兩個視圖添加到根視圖中
 37         self.view.addSubview(menuView)
 38         self.view.addSubview(calendarView)
 39     }
 40     
 41     //添加一個方法,用來監聽視圖控制器對它的子視圖進行佈局的事件
 42     override func viewDidLayoutSubviews()
 43     {
 44         //當監聽到該事件時
 45         super.viewDidLayoutSubviews()
 46         
 47         //依次提交對菜單視圖和日曆視圖的刷新
 48         self.menuView.commitMenuViewUpdate()
 49         self.calendarView.commitCalendarViewUpdate()
 50     }
 51     
 52     override func didReceiveMemoryWarning() {
 53         super.didReceiveMemoryWarning()
 54         // Dispose of any resources that can be recreated.
 55     }
 56 }
 57 
 58 //添加一個針對視圖控制器的擴展,
 59 //並使其遵循日曆視圖協議和日曆菜單視圖協議。
 60 extension ViewController: CVCalendarViewDelegate, CVCalendarMenuViewDelegate
 61 {
 62     //添加一個代理方法,用來設置日曆的模式
 63     func presentationMode() -> CalendarMode
 64     {
 65         //有月模式和周模式兩種
 66         return .monthView
 67     }
 68     
 69     //添加一個代理方法
 70     func firstWeekday() -> Weekday {
 71         //將週日做爲一個星期的開始
 72         return .sunday
 73     }
 74     
 75     //添加一個代理方法,設置在一個星期當中,天天的日期文字顏色
 76     func dayOfWeekTextColor(by weekday: Weekday) -> UIColor
 77     {
 78         //當該日爲週日時,設置文字顏色爲紅色,不然設置文字顏色爲黑色
 79         return weekday == .sunday ? UIColor.red : UIColor.black
 80     }
 81     
 82     //添加一個代理方法,用來設置容許突出顯示某個日期
 83     func shouldShowWeekdaysOut() -> Bool
 84     {
 85         return true
 86     }
 87     
 88     //添加一個代理方法,用來容許以動態的方式進行尺寸的縮放
 89     func shouldAnimateResizing() -> Bool
 90     {
 91         return true
 92     }
 93     
 94     //添加一個代理方法,用來設置是否選中某個日期視圖
 95     private func shouldSelectDayView(dayView: DayView) -> Bool
 96     {
 97         //此處使用隨機的方式來決定是否選中
 98         return arc4random_uniform(3) == 0 ? true : false
 99     }
100     
101     //添加一個代理方法,用來響應某個日期被選中的事件,
102     func didSelectDayView(_ dayView: CVCalendarDayView, animationDidFinish: Bool)
103     {
104         //在控制檯輸出選中的日期
105         print("\(dayView.date.commonDescription) is selected!")
106     }
107     
108     //添加一個代理方法,用來設置是否容許在日期的上方,顯示一個標識符
109     func topMarker(shouldDisplayOnDayView dayView: CVCalendarDayView) -> Bool
110     {
111         return true
112     }
113     
114     //添加一個代理方法,用來設置是否容許在日期的上方,顯示一個點標識
115     func dotMarker(shouldShowOnDayView dayView: CVCalendarDayView) -> Bool
116     {
117         //得到當前位置上的日期的天數
118         let day = dayView.date.day
119         //經過隨機函數生成一個0到30之間的數字
120         let randomDay = Int(arc4random_uniform(31))
121         //假如當前位置上的日期的天數,和隨機數字相同時,
122         //則在日期的位置顯示一個點標識
123         if day == randomDay
124         {
125             return true
126         }
127         
128         //其餘的狀況則不現實點標識
129         return false
130     }
131     
132     //添加一個代理方法,用來設置點標識的顏色
133     func dotMarker(colorOnDayView dayView: CVCalendarDayView) -> [UIColor]
134     {
135         //經過隨機函數生成一個隨機的顏色
136         let red = CGFloat(arc4random_uniform(600) / 255)
137         let green = CGFloat(arc4random_uniform(600) / 255)
138         let blue = CGFloat(arc4random_uniform(600) / 255)
139         
140         //初始化一個隨機的顏色常量
141         let color = UIColor(red: red, green: green, blue: blue, alpha: 1)
142         
143         //生成一個在1和3之間的隨機整數
144         let numberOfDots = Int(arc4random_uniform(3) + 1)
145         //根據隨機整數進行判斷
146         //根據隨機整數的值,返回不一樣長度的顏色數組
147         switch(numberOfDots)
148         {
149             case 2:
150                 return [color, color]
151             case 3:
152                 return [color, color, color]
153             default:
154                 return [color]
155         }
156     }
157     
158     //添加一個代理方法,設置是否在日期上顯示高亮效果
159     func dotMarker(shouldMoveOnHighlightingOnDayView dayView: CVCalendarDayView) -> Bool
160     {
161         return true
162     }
163     
164     //添加一個代理方法,設置點標識的尺寸
165     func dotMarker(sizeOnDayView dayView: DayView) -> CGFloat
166     {
167         return 13
168     }
169     
170     //添加一個代理方法,設置星期的顯示方式
171     func weekdaySymbolType() -> WeekdaySymbolType
172     {
173         //有正常、縮寫和超級縮寫三種樣式能夠選擇
174         return .short
175     }
176     
177     //添加一個代理方法,用來設置選區視圖的貝塞爾路徑
178     func selectionViewPath() -> ((CGRect) -> (UIBezierPath))
179     {
180         //返回日期視圖的顯示區域,做爲選區視圖的路徑
181         return { UIBezierPath(rect: CGRect(x: 0, y: 0, width: $0.width, height: $0.height)) }
182     }
183     
184     //添加一個代理方法,不容許顯示自定義的單獨選區
185     func shouldShowCustomSingleSelection() -> Bool
186     {
187         return false
188     }
189     
190     //添加一個代理方法,用來設置顯示在日期上的輔助視圖
191     func preliminaryView(viewOnDayView dayView: DayView) -> UIView
192     {
193         //初始化一個輔助視圖,設置其顯示區域和日期視圖相同,而且形狀爲圓形。
194         let circleView = CVAuxiliaryView(dayView: dayView, 
195                                          rect: dayView.frame, 
196                                          shape: CVShape.circle)
197         //設置輔助視圖的填充顏色爲淺灰色
198         circleView.fillColor = .colorFromCode(0xCCCCCC)
199         //返回該輔助視圖
200         return circleView
201     }
202     
203     //添加一個代理方法,用來設置是否容許在日期視圖上,顯示一個輔助視圖
204     func preliminaryView(shouldDisplayOnDayView dayView: DayView) -> Bool
205     {
206         //設置當日期視圖中的日期爲當日的天數時,顯示輔助視圖,不然不顯示
207         if (dayView.isCurrentDay)
208         {
209             return true
210         }
211         //不然不顯示
212         return false
213     }
214     
215     //添加一個代理方法,用來設置補充視圖。
216     //該補充視圖將被用來在全部屬於星期五的天數位置,繪製一個圓環。
217     func supplementaryView(viewOnDayView dayView: DayView) -> UIView
218     {
219         //初始化一個圓周率常數
220         let π = M_PI
221         
222         //初始化一個浮點類型的常量,做爲圓環的間距
223         let ringSpacing: CGFloat = 3.0
224         //初始化另外一個浮點類型的常量,做爲圓環的寬度
225         let ringInsetWidth: CGFloat = 1.0
226         //初始化另外一個浮點類型的常量,做爲圓環在垂直方向上的偏移距離
227         let ringVerticalOffset: CGFloat = 1.0
228         //建立一個圖形層變量,用來繪製圓環
229         var ringLayer: CAShapeLayer!
230         //設置圓環路徑的寬度爲1
231         let ringLineWidth: CGFloat = 1.0
232         //設置圓環的線條顏色爲紫色
233         let ringLineColour: UIColor = UIColor.purple
234         
235         //在此建立一個和日期視圖相比,
236         //具備相同顯示區域的視圖對象。
237         let newView = UIView(frame: dayView.bounds)
238         
239         //經過計算得到圓環的直徑數據
240         let diameter: CGFloat = (newView.bounds.width) - ringSpacing
241         //經過直徑算出半徑的大小
242         let radius: CGFloat = diameter / 2.0
243         
244         //從而建立一個矩形區域,用來繪製圓環形狀
245         let rect = CGRect(x: newView.frame.midX-radius, y: newView.frame.midY-radius-ringVerticalOffset, width: diameter, height: diameter)
246         
247         //對圖形層進行初始化操做,
248         ringLayer = CAShapeLayer()
249         //並將該層添加到新建視圖的層中。
250         newView.layer.addSublayer(ringLayer)
251         
252         //設置層的填充顏色爲無色
253         ringLayer.fillColor = nil
254         //設置層的線條寬度
255         ringLayer.lineWidth = ringLineWidth
256         //設置層的描邊屬性
257         ringLayer.strokeColor = ringLineColour.cgColor
258         
259         //初始化一個浮點常量,做爲圓環的線寬嵌入值。
260         let ringLineWidthInset: CGFloat = CGFloat(ringLineWidth/2.0) + ringInsetWidth
261         //經過調用矩形區域對象的相關方法,得到該矩形區域具備相同中心點,可是更大的另外一個矩形區域
262         let ringRect: CGRect = rect.insetBy(dx: ringLineWidthInset, dy: ringLineWidthInset)
263         //得到該區域的中心點座標
264         let centrePoint: CGPoint = CGPoint(x: ringRect.midX, y: ringRect.midY)
265         //得到繪製圓環的起點角度
266         let startAngle: CGFloat = CGFloat(-π/2.0)
267         //生成繪製圓環的結束點角度
268         let endAngle: CGFloat = CGFloat(π * 2.0) + startAngle
269         //經過中心點、半徑、起點角度、結束點角度以及是否順時針等數據,
270         //建立一個環形路徑
271         let ringPath: UIBezierPath = UIBezierPath(arcCenter: centrePoint, //中心點
272                                                   radius: ringRect.width/2.0, //半徑
273                                                   startAngle: startAngle, //起點角度
274                                                   endAngle: endAngle, //結束點角度
275                                                   clockwise: true)//是否順時針
276         //設置層的路徑爲環形路徑
277         ringLayer.path = ringPath.cgPath
278         //設置層的顯示區域,和當前的日期層保持相同
279         ringLayer.frame = newView.layer.bounds
280         
281         //最後返回設置好的附加視圖
282         return newView
283     }
284     
285     //添加一個代理方法,用來設置在何種狀況下,容許顯示輔助視圖。
286     func supplementaryView(shouldDisplayOnDayView dayView: DayView) -> Bool
287     {
288         //當某處的日期的天數爲週五時,在該日期位置顯示一個輔助視圖,
289         //不然不會顯示輔助視圖。
290         if (dayView.date.weekDay == Weekday.friday)
291         {
292             return true
293         }
294         
295         return false
296     }
297     
298     //設置星期文本的顏色爲黑色
299     func dayOfWeekTextColor() -> UIColor
300     {
301         return UIColor.black
302     }
303     
304     //添加一個代理方法,設置星期文本的背景顏色爲無色
305     func dayOfWeekBackGroundColor() -> UIColor
306     {
307         return UIColor.clear
308     }
309 }
相關文章
相關標籤/搜索