@@ -5,15 +5,12 @@ import DateToolsSwift
5
5
public protocol TimelineViewDelegate : AnyObject {
6
6
func timelineView( _ timelineView: TimelineView , didTapAt date: Date )
7
7
func timelineView( _ timelineView: TimelineView , didLongPressAt date: Date )
8
+ func timelineView( _ timelineView: TimelineView , didTap event: EventView )
9
+ func timelineView( _ timelineView: TimelineView , didLongPress event: EventView )
8
10
}
9
11
10
12
public class TimelineView : UIView {
11
13
public weak var delegate : TimelineViewDelegate ?
12
- public weak var eventViewDelegate : EventViewDelegate ? {
13
- didSet {
14
- self . allDayView. eventViewDelegate = eventViewDelegate
15
- }
16
- }
17
14
18
15
public var date = Date ( ) {
19
16
didSet {
@@ -174,19 +171,45 @@ public class TimelineView: UIView {
174
171
175
172
// MARK: - Event Handling
176
173
177
- @objc func longPress( _ gestureRecognizer: UILongPressGestureRecognizer ) {
174
+ @objc private func longPress( _ gestureRecognizer: UILongPressGestureRecognizer ) {
178
175
if ( gestureRecognizer. state == . began) {
179
176
// Get timeslot of gesture location
180
177
let pressedLocation = gestureRecognizer. location ( in: self )
181
- delegate? . timelineView ( self , didLongPressAt: yToDate ( pressedLocation. y) )
178
+ if let eventView = findEventView ( at: pressedLocation) {
179
+ delegate? . timelineView ( self , didLongPress: eventView)
180
+ } else {
181
+ delegate? . timelineView ( self , didLongPressAt: yToDate ( pressedLocation. y) )
182
+ }
182
183
}
183
184
}
184
-
185
- @objc func tap( _ sender: UITapGestureRecognizer ) {
185
+
186
+ @objc private func tap( _ sender: UITapGestureRecognizer ) {
186
187
let pressedLocation = sender. location ( in: self )
187
- delegate? . timelineView ( self , didTapAt: yToDate ( pressedLocation. y) )
188
+ if let eventView = findEventView ( at: pressedLocation) {
189
+ delegate? . timelineView ( self , didTap: eventView)
190
+ } else {
191
+ delegate? . timelineView ( self , didTapAt: yToDate ( pressedLocation. y) )
192
+ }
188
193
}
189
194
195
+ private func findEventView( at point: CGPoint ) -> EventView ? {
196
+ for eventView in eventViews {
197
+ let frame = eventView. frame
198
+ if frame. contains ( point) {
199
+ return eventView
200
+ }
201
+ }
202
+
203
+ for eventView in allDayView. eventViews {
204
+ let frame = eventView. convert ( eventView. bounds, to: self )
205
+ if frame. contains ( point) {
206
+ return eventView
207
+ }
208
+ }
209
+ return nil
210
+ }
211
+
212
+
190
213
/**
191
214
Custom implementation of the hitTest method is needed for the tap gesture recognizers
192
215
located in the AllDayView to work.
@@ -420,7 +443,6 @@ public class TimelineView: UIView {
420
443
eventViews. removeAll ( )
421
444
for _ in regularLayoutAttributes {
422
445
let newView = pool. dequeue ( )
423
- newView. delegate = eventViewDelegate
424
446
if newView. superview == nil {
425
447
addSubview ( newView)
426
448
}
0 commit comments