Skip to content

Commit 4452265

Browse files
committed
Merge dateinterval into master
2 parents a5e6f19 + aa51aa2 commit 4452265

File tree

9 files changed

+35
-55
lines changed

9 files changed

+35
-55
lines changed

CalendarKit.podspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Pod::Spec.new do |s|
77
s.author = { "Richard Topchii" => "richardtop@users.noreply.github.com" }
88
s.source = { :git => "https://github.com/richardtop/CalendarKit.git", :tag => s.version.to_s }
99
s.social_media_url = 'https://github.com/richardtop'
10-
s.platform = :ios, '9.0'
10+
s.platform = :ios, '10.0'
1111
s.swift_version = '5.3'
1212
s.requires_arc = true
1313
s.source_files = 'Sources/**/*.swift'

CalendarKitDemo/CalendarApp/CustomCalendarExampleController.swift

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,14 @@ class CustomCalendarExampleController: DayViewController {
8686
let event = Event()
8787

8888
let duration = Int.random(in: 60 ... 160)
89-
event.startDate = workingDate
90-
event.endDate = Calendar.current.date(byAdding: .minute, value: duration, to: workingDate)!
89+
event.dateInterval = DateInterval(start: workingDate, duration: TimeInterval(duration * 60))
9190

9291
var info = data[Int(arc4random_uniform(UInt32(data.count)))]
9392

9493
let timezone = dayView.calendar.timeZone
9594
print(timezone)
9695

97-
info.append(rangeFormatter.string(from: event.startDate, to: event.endDate))
96+
info.append(rangeFormatter.string(from: event.dateInterval.start, to: event.dateInterval.end))
9897
event.text = info.reduce("", {$0 + $1 + "\n"})
9998
event.color = colors[Int(arc4random_uniform(UInt32(colors.count)))]
10099
event.isAllDay = Int(arc4random_uniform(2)) % 2 == 0
@@ -164,13 +163,12 @@ class CustomCalendarExampleController: DayViewController {
164163
let duration = Int(arc4random_uniform(160) + 60)
165164
let startDate = Calendar.current.date(byAdding: .minute, value: -Int(CGFloat(duration) / 2), to: date)!
166165
let event = Event()
167-
168-
event.startDate = startDate
169-
event.endDate = Calendar.current.date(byAdding: .minute, value: duration, to: startDate)!
166+
167+
event.dateInterval = DateInterval(start: startDate, duration: TimeInterval(duration * 60))
170168

171169
var info = data[Int(arc4random_uniform(UInt32(data.count)))]
172170

173-
info.append(rangeFormatter.string(from: event.startDate, to: event.endDate))
171+
info.append(rangeFormatter.string(from: event.dateInterval)!)
174172
event.text = info.reduce("", {$0 + $1 + "\n"})
175173
event.color = colors[Int(arc4random_uniform(UInt32(colors.count)))]
176174
event.editedEvent = event
@@ -180,7 +178,7 @@ class CustomCalendarExampleController: DayViewController {
180178

181179
override func dayView(dayView: DayView, didUpdate event: EventDescriptor) {
182180
print("did finish editing \(event)")
183-
print("new startDate: \(event.startDate) new endDate: \(event.endDate)")
181+
print("new startDate: \(event.dateInterval.start) new endDate: \(event.dateInterval.end)")
184182

185183
if let _ = event.editedEvent {
186184
event.commitEditing()

Package.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ let package = Package(
66
name: "CalendarKit",
77
defaultLocalization: "en",
88
platforms: [
9-
.iOS(.v9),
9+
.iOS(.v10),
1010
],
1111
products: [
1212
// Products define the executables and libraries produced by a package, and make them visible to other packages.

README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,8 @@ override func eventsForDate(_ date: Date) -> [EventDescriptor] {
6868
for model in models {
6969
// Create new EventView
7070
let event = Event()
71-
// Specify StartDate and EndDate
72-
event.startDate = model.startDate
73-
event.endDate = model.endDate
71+
// Specify DateInterval
72+
event.dateInterval = DateInterval(start: model.startDate, end: model.endDate)
7473
// Add info: event title, subtitle, location to the array of Strings
7574
var info = [model.title, model.location]
7675
info.append("\(datePeriod.beginning!.format(with: "HH:mm")) - \(datePeriod.end!.format(with: "HH:mm"))")
@@ -120,7 +119,7 @@ dayView.updateStyle(style)
120119

121120
## Requirements
122121

123-
- iOS 9.0+, macOS (Catalyst) 10.15+
122+
- iOS 10.0+, macOS (Catalyst) 10.15+
124123
- Swift 4+ (Library is written in Swift 5)
125124

126125
## Contributing

Sources/Extensions/EventDescriptor+DatePeriod.swift

Lines changed: 0 additions & 12 deletions
This file was deleted.

Sources/Timeline/Event.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import UIKit
22

33
public final class Event: EventDescriptor {
4-
public var startDate = Date()
5-
public var endDate = Date()
4+
public var dateInterval = DateInterval()
65
public var isAllDay = false
76
public var text = ""
87
public var attributedText: NSAttributedString?
@@ -26,8 +25,7 @@ public final class Event: EventDescriptor {
2625

2726
public func makeEditable() -> Event {
2827
let cloned = Event()
29-
cloned.startDate = startDate
30-
cloned.endDate = endDate
28+
cloned.dateInterval = dateInterval
3129
cloned.isAllDay = isAllDay
3230
cloned.text = text
3331
cloned.attributedText = attributedText
@@ -42,8 +40,7 @@ public final class Event: EventDescriptor {
4240

4341
public func commitEditing() {
4442
guard let edited = editedEvent else {return}
45-
edited.startDate = startDate
46-
edited.endDate = endDate
43+
edited.dateInterval = dateInterval
4744
}
4845

4946
private func updateColors() {

Sources/Timeline/EventDescriptor.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import Foundation
22
import UIKit
33

44
public protocol EventDescriptor: AnyObject {
5-
var startDate: Date {get set}
6-
var endDate: Date {get set}
5+
var dateInterval: DateInterval {get set}
76
var isAllDay: Bool {get}
87
var text: String {get}
98
var attributedText: NSAttributedString? {get}

Sources/Timeline/TimelinePagerView.swift

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ public final class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScr
193193
let events = dataSource.eventsForDate(date)
194194

195195
let end = calendar.date(byAdding: .day, value: 1, to: date)!
196-
let day = date ... end
197-
let validEvents = events.filter{$0.datePeriod.overlaps(day)}
196+
let day = DateInterval(start: date, end: end)
197+
let validEvents = events.filter{$0.dateInterval.intersects(day)}
198198
timeline.layoutAttributes = validEvents.map(EventLayoutAttributes.init)
199199
}
200200

@@ -233,8 +233,8 @@ public final class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScr
233233
let timeline = currentTimeline.timeline
234234
let offset = currentTimeline.container.contentOffset.y
235235
// algo needs to be extracted to a separate object
236-
let yStart = timeline.dateToY(event.startDate) - offset
237-
let yEnd = timeline.dateToY(event.endDate) - offset
236+
let yStart = timeline.dateToY(event.dateInterval.start) - offset
237+
let yEnd = timeline.dateToY(event.dateInterval.end) - offset
238238

239239

240240
let rightToLeft = UIView.userInterfaceLayoutDirection(for: semanticContentAttribute) == .rightToLeft
@@ -355,7 +355,7 @@ public final class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScr
355355
eventFrame.origin.y = timeline.dateToY(snapped) - currentTimeline.container.contentOffset.y
356356

357357
if resizeHandleTag == 0 {
358-
eventFrame.size.height = timeline.dateToY(descriptor.endDate) - timeline.dateToY(snapped)
358+
eventFrame.size.height = timeline.dateToY(descriptor.dateInterval.end) - timeline.dateToY(snapped)
359359
} else if resizeHandleTag == 1 {
360360
let bottomHandleYTD = yToDate(y: editedEventView.frame.origin.y + editedEventView.frame.size.height,
361361
timeline: timeline)
@@ -417,8 +417,7 @@ public final class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScr
417417
let endY = converted.maxY
418418
let beginning = timeline.yToDate(beginningY)
419419
let end = timeline.yToDate(endY)
420-
descriptor.startDate = beginning
421-
descriptor.endDate = end
420+
descriptor.dateInterval = DateInterval(start: beginning, end: end)
422421
}
423422
}
424423

Sources/Timeline/TimelineView.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -436,8 +436,8 @@ public final class TimelineView: UIView {
436436

437437
// only non allDay events need their frames to be set
438438
let sortedEvents = self.regularLayoutAttributes.sorted { (attr1, attr2) -> Bool in
439-
let start1 = attr1.descriptor.startDate
440-
let start2 = attr2.descriptor.startDate
439+
let start1 = attr1.descriptor.dateInterval.start
440+
let start2 = attr2.descriptor.dateInterval.start
441441
return start1 < start2
442442
}
443443

@@ -451,26 +451,26 @@ public final class TimelineView: UIView {
451451
}
452452

453453
let longestEvent = overlappingEvents.sorted { (attr1, attr2) -> Bool in
454-
var period = attr1.descriptor.datePeriod
455-
let period1 = period.upperBound.timeIntervalSince(period.lowerBound)
456-
period = attr2.descriptor.datePeriod
457-
let period2 = period.upperBound.timeIntervalSince(period.lowerBound)
454+
var period = attr1.descriptor.dateInterval
455+
let period1 = period.end.timeIntervalSince(period.start)
456+
period = attr2.descriptor.dateInterval
457+
let period2 = period.end.timeIntervalSince(period.start)
458458

459459
return period1 > period2
460460
}
461461
.first!
462462

463463
if style.eventsWillOverlap {
464-
guard let earliestEvent = overlappingEvents.first?.descriptor.startDate else { continue }
464+
guard let earliestEvent = overlappingEvents.first?.descriptor.dateInterval.start else { continue }
465465
let dateInterval = getDateInterval(date: earliestEvent)
466-
if event.descriptor.datePeriod.contains(dateInterval.lowerBound) {
466+
if event.descriptor.dateInterval.contains(dateInterval.start) {
467467
overlappingEvents.append(event)
468468
continue
469469
}
470470
} else {
471471
let lastEvent = overlappingEvents.last!
472-
if (longestEvent.descriptor.datePeriod.overlaps(event.descriptor.datePeriod) && (longestEvent.descriptor.endDate != event.descriptor.startDate || style.eventGap <= 0.0)) ||
473-
(lastEvent.descriptor.datePeriod.overlaps(event.descriptor.datePeriod) && (lastEvent.descriptor.endDate != event.descriptor.startDate || style.eventGap <= 0.0)) {
472+
if (longestEvent.descriptor.dateInterval.intersects(event.descriptor.dateInterval) && (longestEvent.descriptor.dateInterval.end != event.descriptor.dateInterval.start || style.eventGap <= 0.0)) ||
473+
(lastEvent.descriptor.dateInterval.intersects(event.descriptor.dateInterval) && (lastEvent.descriptor.dateInterval.end != event.descriptor.dateInterval.start || style.eventGap <= 0.0)) {
474474
overlappingEvents.append(event)
475475
continue
476476
}
@@ -485,8 +485,8 @@ public final class TimelineView: UIView {
485485
for overlappingEvents in groupsOfEvents {
486486
let totalCount = CGFloat(overlappingEvents.count)
487487
for (index, event) in overlappingEvents.enumerated() {
488-
let startY = dateToY(event.descriptor.datePeriod.lowerBound)
489-
let endY = dateToY(event.descriptor.datePeriod.upperBound)
488+
let startY = dateToY(event.descriptor.dateInterval.start)
489+
let endY = dateToY(event.descriptor.dateInterval.end)
490490
let floatIndex = CGFloat(index)
491491
let x = style.leadingInset + floatIndex / totalCount * calendarWidth
492492
let equalWidth = calendarWidth / totalCount
@@ -561,13 +561,13 @@ public final class TimelineView: UIView {
561561
return calendar.component(component, from: date)
562562
}
563563

564-
private func getDateInterval(date: Date) -> ClosedRange<Date> {
564+
private func getDateInterval(date: Date) -> DateInterval {
565565
let earliestEventMintues = component(component: .minute, from: date)
566566
let splitMinuteInterval = style.splitMinuteInterval
567567
let minute = component(component: .minute, from: date)
568568
let minuteRange = (minute / splitMinuteInterval) * splitMinuteInterval
569569
let beginningRange = calendar.date(byAdding: .minute, value: -(earliestEventMintues - minuteRange), to: date)!
570570
let endRange = calendar.date(byAdding: .minute, value: splitMinuteInterval, to: beginningRange)!
571-
return beginningRange ... endRange
571+
return DateInterval(start: beginningRange, end: endRange)
572572
}
573573
}

0 commit comments

Comments
 (0)