From e0e8bccef1e166dad023537999e3d4ef95f62f52 Mon Sep 17 00:00:00 2001 From: Amirhasan Kolahi Date: Fri, 17 Oct 2025 00:23:06 +0300 Subject: [PATCH] fix: play handle view will escape start and end limits if you grab it from other part of frame, when using trimMaximumDuration if start or end handle view moves so fast towards limited duration they will stop few seconds before reaching the limit. --- VideoTrim/Classes/VideoTrim.swift | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/VideoTrim/Classes/VideoTrim.swift b/VideoTrim/Classes/VideoTrim.swift index 248144a..e43d402 100644 --- a/VideoTrim/Classes/VideoTrim.swift +++ b/VideoTrim/Classes/VideoTrim.swift @@ -877,6 +877,12 @@ open class VideoTrim: UIView { let maximumTime = CGFloat(trimMaximumDuration.value) / CGFloat(trimMaximumDuration.timescale) let makeTime = CGFloat(makeDuration.value) / CGFloat(makeDuration.timescale) if maximumTime < makeTime { + // Snap to the maximum allowed start point + let maxWidth = frameWidth * (maximumTime / (CGFloat(asset!.duration.value) / CGFloat(asset!.duration.timescale))) + let newLeading = frameWidth - maxWidth - abs(trailingConstraint?.constant ?? 0) + leadingConstraint?.constant = max(0, newLeading) + updateTotalTime() + updatePlayTime() return } } @@ -916,6 +922,12 @@ open class VideoTrim: UIView { let maximumTime = CGFloat(trimMaximumDuration.value) / CGFloat(trimMaximumDuration.timescale) let makeTime = CGFloat(makeDuration.value) / CGFloat(makeDuration.timescale) if maximumTime < makeTime { + // Snap to maximum allowed end point + let maxWidth = frameWidth * (maximumTime / (CGFloat(asset!.duration.value) / CGFloat(asset!.duration.timescale))) + let newTrailing = -(frameWidth - abs((leadingConstraint?.constant ?? 0)) - maxWidth) + trailingConstraint?.constant = min(0, newTrailing) + updateTotalTime() + updatePlayTime() return } } @@ -970,6 +982,21 @@ open class VideoTrim: UIView { let point = sender.location(in: frameContainerView) let constant = point.x let playTimeLineViewLeadingConstraint = frameContainerView.constraints.filter({ $0.identifier == "playTimeLineViewLeading" }).first + + if let leadingConstraint = frameContainerView.constraints.filter({ $0.identifier == "trimContainerViewLeading" }).first, let trailingConstraint = frameContainerView.constraints.filter({ $0.identifier == "trimContainerViewTrailing" }).first { + if leadingConstraint.constant > constant { + playTimeLineViewLeadingConstraint?.constant = leadingConstraint.constant + updatePlayTime() + delegate?.videoTrimPlayTimeChange(self) + return + } else if constant > frameWidth - abs(trailingConstraint.constant) - playLineWidth { + playTimeLineViewLeadingConstraint?.constant = frameWidth - abs(trailingConstraint.constant) - playLineWidth + updatePlayTime() + delegate?.videoTrimPlayTimeChange(self) + return + } + } + playTimeLineViewLeadingConstraint?.constant = constant + (playLineWidth / 2) updatePlayTime() delegate?.videoTrimPlayTimeChange(self)