Digital ACT-191 ONEAPP-6830 story: updated with required callbacks

This commit is contained in:
vasavk 2024-03-27 16:01:15 +05:30
parent 4a9262c0dc
commit 6380026eaa

View File

@ -105,7 +105,20 @@ open class CarouselScrollbar: View {
open var scrubberId: Int? { didSet { setNeedsUpdate() } }
/// A callback when the scrubber position changes. Passes parameters (position).
open var onScrubberDidChange: ((Int) -> Void)?
open var onScrubberDrag: ((Int) -> Void)?
/// A callback when the thumb move forward. Passes parameters (position).
open var onMoveForward: ((Int) -> Void)?
/// A callback when the thumb move backward. Passes parameters (position).
open var onMoveBackward: ((Int) -> Void)?
/// A callback when the thumb touch start. Passes parameters (position).
open var onThumbTouchStart: ((Int) -> Void)?
/// A callback when the thumb touch end. Passes parameters (position).
open var onThumbTouchEnd: ((Int) -> Void)?
//--------------------------------------------------
// MARK: - Private Properties
@ -154,6 +167,7 @@ open class CarouselScrollbar: View {
open override func setup() {
super.setup()
isAccessibilityElement = true
accessibilityLabel = "Carousel Scrollbar"
addSubview(containerView)
@ -201,7 +215,7 @@ open class CarouselScrollbar: View {
//Thumbview
thumbView.frame = CGRectMake(0, 0, CGFloat(thumbWidth), containerSize.height)
thumbView.backgroundColor = .clear
thumbView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action:(#selector(onScrubberDrag(_:)))))
thumbView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action:(#selector(onScrubberChange(_:)))))
containerView.addSubview(thumbView)
updateActiveOverlays()
@ -233,14 +247,16 @@ open class CarouselScrollbar: View {
//--------------------------------------------------
// MARK: - Private Methods
//--------------------------------------------------
func onMoveBackward() {
func movePositionBackward() {
position = position - 1
scrollThumbToPosition(position)
self.onMoveBackward?(position)
}
func onMoveForward() {
func movePositionForward() {
position = position + 1
scrollThumbToPosition(position)
self.onMoveForward?(position)
}
// Compute track width and should maintain minimum thumb width if needed
@ -281,14 +297,14 @@ open class CarouselScrollbar: View {
totalPositions = Int (ceil (Double(numberOfSlides) / Double(_selectedLayout.value)))
}
private func scrollThumbToPosition(_ position: Int?) {
private func scrollThumbToPosition(_ position: Int) {
self.setThumb(at: position)
self.onScrubberDidChange?(position ?? 1)
self.onScrubberDrag?(position)
}
private func setThumb(at position: Int?) {
private func setThumb(at position: Int) {
UIView.animate(withDuration: 0.1, delay: 0.0, options: .curveLinear, animations: {
self.thumbView.frame.origin.x = CGFloat(Float((position ?? 1) - 1) * self.computedWidth) + self.trackView.frame.origin.x
self.thumbView.frame.origin.x = CGFloat(Float((position) - 1) * self.computedWidth) + self.trackView.frame.origin.x
self.updateActiveOverlays()
})
}
@ -298,10 +314,11 @@ open class CarouselScrollbar: View {
//--------------------------------------------------
// Drag scrollbar thumb to move it to the left or right.
// Upon releases of drag, the scrollbar thumb snaps to the closest full position and the scrollbar returns to original size without delay.
@objc func onScrubberDrag(_ sender: UIPanGestureRecognizer) {
@objc func onScrubberChange(_ sender: UIPanGestureRecognizer) {
let translation = sender.translation(in: thumbView)
if sender.state == UIGestureRecognizer.State.began {
trayOriginalCenter = thumbView.center
self.onThumbTouchStart?(position)
} else if sender.state == UIGestureRecognizer.State.changed {
let draggedPositions = Int (ceil (Double(translation.x) / Double(computedWidth)))
setThumb(at: position + draggedPositions)
@ -309,17 +326,20 @@ open class CarouselScrollbar: View {
else if sender.state == UIGestureRecognizer.State.cancelled || sender.state == UIGestureRecognizer.State.ended {
let draggedPositions = Int (ceil (Double(translation.x) / Double(computedWidth)))
position = ((position + draggedPositions) < 1) ? 1 : (position + draggedPositions)
if sender.state == UIGestureRecognizer.State.ended {
self.onThumbTouchEnd?(position)
}
}
}
// Move the scrollbar thumb to the left while tapping on the left side of the scrubber.
@objc func onLeftViewLongPressRecognizer(_ gesture: UILongPressGestureRecognizer) {
animateOverlay(layer: leftActiveOverlayLayer, with: gesture, onGestureEnd: onMoveBackward)
animateOverlay(layer: leftActiveOverlayLayer, with: gesture, onGestureEnd: movePositionBackward)
}
// Move the scrollbar thumb to the right while tapping on the right side of the scrubber.
@objc func onRightViewLongPressRecognizer(_ gesture: UILongPressGestureRecognizer) {
animateOverlay(layer: rightActiveOverlayLayer, with: gesture, onGestureEnd: onMoveForward)
animateOverlay(layer: rightActiveOverlayLayer, with: gesture, onGestureEnd: movePositionForward)
}
private func animateOverlay(layer: CALayer, with gesture: UILongPressGestureRecognizer, onGestureEnd: @escaping(() -> Void)) {