Skip to content

Commit 318ef6c

Browse files
committed
Fix long press event gesture not being recognized
1 parent 456b366 commit 318ef6c

File tree

5 files changed

+45
-66
lines changed

5 files changed

+45
-66
lines changed

Source/DayView.swift

+1-10
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public protocol DayViewDelegate: AnyObject {
1313
func dayView(dayView: DayView, didUpdate event: EventDescriptor)
1414
}
1515

16-
public class DayView: UIView, EventViewDelegate, TimelinePagerViewDelegate {
16+
public class DayView: UIView, TimelinePagerViewDelegate {
1717

1818
public weak var dataSource: EventDataSource? {
1919
get {
@@ -145,15 +145,6 @@ public class DayView: UIView, EventViewDelegate, TimelinePagerViewDelegate {
145145
timelinePagerView.endEventEditing()
146146
}
147147

148-
// MARK: EventViewDelegate
149-
150-
public func eventViewDidTap(_ eventView: EventView) {
151-
delegate?.dayViewDidSelectEventView(eventView)
152-
}
153-
public func eventViewDidLongPress(_ eventview: EventView) {
154-
delegate?.dayViewDidLongPressEventView(eventview)
155-
}
156-
157148
// MARK: TimelinePagerViewDelegate
158149

159150
public func timelinePagerDidSelectEventView(_ eventView: EventView) {

Source/Timeline/AllDayView.swift

+4-10
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,6 @@
22
import UIKit
33

44
public class AllDayView: UIView {
5-
6-
internal weak var eventViewDelegate: EventViewDelegate?
7-
85
var style = AllDayViewStyle()
96

107
let allDayLabelWidth: CGFloat = 53.0
@@ -16,6 +13,8 @@ public class AllDayView: UIView {
1613
}
1714
}
1815

16+
public private(set) var eventViews = [EventView]()
17+
1918
private lazy var textLabel: UILabel = {
2019
let label = UILabel(frame: CGRect(x: 8.0, y: 4.0, width: allDayLabelWidth, height: 24.0))
2120
label.text = localizedString("all-day")
@@ -87,13 +86,11 @@ public class AllDayView: UIView {
8786

8887
override init(frame: CGRect) {
8988
super.init(frame: frame)
90-
9189
configure()
9290
}
9391

9492
required public init?(coder aDecoder: NSCoder) {
9593
super.init(coder: aDecoder)
96-
9794
configure()
9895
}
9996

@@ -130,6 +127,7 @@ public class AllDayView: UIView {
130127
}
131128

132129
// clear event views from scroll view
130+
eventViews.removeAll()
133131
scrollView.subviews.forEach { $0.removeFromSuperview() }
134132

135133
if self.events.count == 0 { return }
@@ -146,7 +144,6 @@ public class AllDayView: UIView {
146144
// create event
147145
let eventView = EventView(frame: CGRect.zero)
148146
eventView.updateWithDescriptor(event: anEventDescriptor)
149-
eventView.delegate = self.eventViewDelegate
150147
eventView.heightAnchor.constraint(equalToConstant: allDayEventHeight).isActive = true
151148

152149
// create horz stack view if index % 2 == 0
@@ -162,6 +159,7 @@ public class AllDayView: UIView {
162159

163160
// add eventView to horz. stack view
164161
horizontalStackView.addArrangedSubview(eventView)
162+
eventViews.append(eventView)
165163
}
166164

167165
// add vert. stack view inside, pin vert. stack view, update content view by the number of horz. stack views
@@ -177,8 +175,4 @@ public class AllDayView: UIView {
177175
verticalStackViewHeightConstraint.priority = UILayoutPriority(rawValue: 999)
178176
verticalStackViewHeightConstraint.isActive = true
179177
}
180-
181-
// MARK: - LIFE CYCLE
182-
183178
}
184-

Source/Timeline/EventView.swift

-26
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@ import UIKit
22
import DateToolsSwift
33
import Neon
44

5-
public protocol EventViewDelegate: AnyObject {
6-
func eventViewDidTap(_ eventView: EventView)
7-
func eventViewDidLongPress(_ eventview: EventView)
8-
}
9-
105
open class EventView: UIView {
11-
12-
weak var delegate: EventViewDelegate?
136
public var descriptor: EventDescriptor?
147

158
public var color = UIColor.lightGray
@@ -26,12 +19,6 @@ open class EventView: UIView {
2619
return view
2720
}()
2821

29-
lazy var tapGestureRecognizer = UITapGestureRecognizer(target: self,
30-
action: #selector(tap))
31-
32-
lazy var longPressGestureRecognizer = UILongPressGestureRecognizer(target: self,
33-
action: #selector(longPress))
34-
3522
/// Resize Handle views showing up when editing the event.
3623
/// The top handle has a tag of `0` and the bottom has a tag of `1`
3724
public lazy var eventResizeHandles = [EventResizeHandleView(), EventResizeHandleView()]
@@ -48,8 +35,6 @@ open class EventView: UIView {
4835

4936
func configure() {
5037
clipsToBounds = false
51-
[tapGestureRecognizer, longPressGestureRecognizer].forEach {addGestureRecognizer($0)}
52-
5338
color = tintColor
5439
addSubview(textView)
5540

@@ -79,16 +64,6 @@ open class EventView: UIView {
7964
setNeedsLayout()
8065
}
8166

82-
@objc func tap() {
83-
delegate?.eventViewDidTap(self)
84-
}
85-
86-
@objc func longPress(_ sender: UILongPressGestureRecognizer) {
87-
if sender.state == .began {
88-
delegate?.eventViewDidLongPress(self)
89-
}
90-
}
91-
9267
/**
9368
Custom implementation of the hitTest method is needed for the tap gesture recognizers
9469
located in the ResizeHandleView to work.
@@ -186,4 +161,3 @@ open class EventView: UIView {
186161
completion: nil)
187162
}
188163
}
189-

Source/Timeline/TimelinePagerView.swift

+7-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public protocol TimelinePagerViewDelegate: AnyObject {
1515
func timelinePager(timelinePager: TimelinePagerView, didUpdate event: EventDescriptor)
1616
}
1717

18-
public class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScrollViewDelegate, DayViewStateUpdating, UIPageViewControllerDataSource, UIPageViewControllerDelegate, TimelineViewDelegate, EventViewDelegate {
18+
public class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScrollViewDelegate, DayViewStateUpdating, UIPageViewControllerDataSource, UIPageViewControllerDelegate, TimelineViewDelegate {
1919

2020
public weak var dataSource: EventDataSource?
2121
public weak var delegate: TimelinePagerViewDelegate?
@@ -135,7 +135,6 @@ public class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScrollVie
135135
let timeline = controller.timeline
136136
timeline.longPressGestureRecognizer.addTarget(self, action: #selector(timelineDidLongPress(_:)))
137137
timeline.delegate = self
138-
timeline.eventViewDelegate = self
139138
timeline.calendar = calendar
140139
timeline.date = date.dateOnly(calendar: calendar)
141140
controller.container.delegate = self
@@ -455,13 +454,12 @@ public class TimelinePagerView: UIView, UIGestureRecognizerDelegate, UIScrollVie
455454
public func timelineView(_ timelineView: TimelineView, didLongPressAt date: Date) {
456455
delegate?.timelinePager(timelinePager: self, didLongPressTimelineAt: date)
457456
}
458-
459-
// MARK: EventViewDelegate
460-
461-
public func eventViewDidTap(_ eventView: EventView) {
462-
delegate?.timelinePagerDidSelectEventView(eventView)
457+
458+
public func timelineView(_ timelineView: TimelineView, didTap event: EventView) {
459+
delegate?.timelinePagerDidSelectEventView(event)
463460
}
464-
public func eventViewDidLongPress(_ eventview: EventView) {
465-
delegate?.timelinePagerDidLongPressEventView(eventview)
461+
462+
public func timelineView(_ timelineView: TimelineView, didLongPress event: EventView) {
463+
delegate?.timelinePagerDidLongPressEventView(event)
466464
}
467465
}

Source/Timeline/TimelineView.swift

+33-11
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@ import DateToolsSwift
55
public protocol TimelineViewDelegate: AnyObject {
66
func timelineView(_ timelineView: TimelineView, didTapAt date: Date)
77
func timelineView(_ timelineView: TimelineView, didLongPressAt date: Date)
8+
func timelineView(_ timelineView: TimelineView, didTap event: EventView)
9+
func timelineView(_ timelineView: TimelineView, didLongPress event: EventView)
810
}
911

1012
public class TimelineView: UIView {
1113
public weak var delegate: TimelineViewDelegate?
12-
public weak var eventViewDelegate: EventViewDelegate? {
13-
didSet {
14-
self.allDayView.eventViewDelegate = eventViewDelegate
15-
}
16-
}
1714

1815
public var date = Date() {
1916
didSet {
@@ -174,19 +171,45 @@ public class TimelineView: UIView {
174171

175172
// MARK: - Event Handling
176173

177-
@objc func longPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
174+
@objc private func longPress(_ gestureRecognizer: UILongPressGestureRecognizer) {
178175
if (gestureRecognizer.state == .began) {
179176
// Get timeslot of gesture location
180177
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+
}
182183
}
183184
}
184-
185-
@objc func tap(_ sender: UITapGestureRecognizer) {
185+
186+
@objc private func tap(_ sender: UITapGestureRecognizer) {
186187
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+
}
188193
}
189194

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+
190213
/**
191214
Custom implementation of the hitTest method is needed for the tap gesture recognizers
192215
located in the AllDayView to work.
@@ -420,7 +443,6 @@ public class TimelineView: UIView {
420443
eventViews.removeAll()
421444
for _ in regularLayoutAttributes {
422445
let newView = pool.dequeue()
423-
newView.delegate = eventViewDelegate
424446
if newView.superview == nil {
425447
addSubview(newView)
426448
}

0 commit comments

Comments
 (0)