★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(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 }