mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-16 19:30:29 +00:00
Various fixes
This commit is contained in:
parent
1e5c22a6a1
commit
5e603f90b1
@ -3086,10 +3086,14 @@ public final class MediaEditorScreen: ViewController, UIDropInteractionDelegate
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let duration = audioAsset.duration.seconds
|
let audioDuration = audioAsset.duration.seconds
|
||||||
mediaEditor.setAudioTrack(MediaAudioTrack(path: fileName, artist: artist, title: title, duration: duration))
|
mediaEditor.setAudioTrack(MediaAudioTrack(path: fileName, artist: artist, title: title, duration: audioDuration))
|
||||||
if !mediaEditor.sourceIsVideo {
|
if mediaEditor.sourceIsVideo {
|
||||||
mediaEditor.setAudioTrackTrimRange(0 ..< min(15, duration), apply: true)
|
if let videoDuration = mediaEditor.duration {
|
||||||
|
mediaEditor.setAudioTrackTrimRange(0 ..< min(videoDuration, audioDuration), apply: true)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mediaEditor.setAudioTrackTrimRange(0 ..< min(15, audioDuration), apply: true)
|
||||||
}
|
}
|
||||||
|
|
||||||
self.requestUpdate(transition: .easeInOut(duration: 0.2))
|
self.requestUpdate(transition: .easeInOut(duration: 0.2))
|
||||||
|
|||||||
@ -155,7 +155,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
private let audioBackgroundView: BlurredBackgroundView
|
private let audioBackgroundView: BlurredBackgroundView
|
||||||
private let audioVibrancyView: UIVisualEffectView
|
private let audioVibrancyView: UIVisualEffectView
|
||||||
private let audioVibrancyContainer: UIView
|
private let audioVibrancyContainer: UIView
|
||||||
private let audioButton = UIButton()
|
|
||||||
|
|
||||||
private let audioContentContainerView: UIView
|
private let audioContentContainerView: UIView
|
||||||
private let audioContentMaskView: UIImageView
|
private let audioContentMaskView: UIImageView
|
||||||
@ -171,7 +170,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
|
|
||||||
private let transparentFramesContainer = UIView()
|
private let transparentFramesContainer = UIView()
|
||||||
private let opaqueFramesContainer = UIView()
|
private let opaqueFramesContainer = UIView()
|
||||||
private let videoButton = UIButton()
|
|
||||||
|
|
||||||
private var transparentFrameLayers: [VideoFrameLayer] = []
|
private var transparentFrameLayers: [VideoFrameLayer] = []
|
||||||
private var opaqueFrameLayers: [VideoFrameLayer] = []
|
private var opaqueFrameLayers: [VideoFrameLayer] = []
|
||||||
@ -213,9 +211,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
|
|
||||||
self.audioIconView = UIImageView(image: UIImage(bundleImageName: "Media Editor/SmallAudio"))
|
self.audioIconView = UIImageView(image: UIImage(bundleImageName: "Media Editor/SmallAudio"))
|
||||||
|
|
||||||
self.audioButton.isUserInteractionEnabled = false
|
|
||||||
self.videoButton.isUserInteractionEnabled = false
|
|
||||||
|
|
||||||
super.init(frame: frame)
|
super.init(frame: frame)
|
||||||
|
|
||||||
self.clipsToBounds = false
|
self.clipsToBounds = false
|
||||||
@ -256,8 +251,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
self.addSubview(self.ghostTrimView)
|
self.addSubview(self.ghostTrimView)
|
||||||
self.addSubview(self.trimView)
|
self.addSubview(self.trimView)
|
||||||
|
|
||||||
self.addSubview(self.audioButton)
|
|
||||||
self.addSubview(self.videoButton)
|
|
||||||
self.addSubview(self.cursorView)
|
self.addSubview(self.cursorView)
|
||||||
|
|
||||||
self.cursorView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.handlePositionHandlePan(_:))))
|
self.cursorView.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(self.handlePositionHandlePan(_:))))
|
||||||
@ -287,13 +280,13 @@ final class VideoScrubberComponent: Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.audioButton.addTarget(self, action: #selector(self.audioButtonPressed), for: .touchUpInside)
|
|
||||||
self.videoButton.addTarget(self, action: #selector(self.videoButtonPressed), for: .touchUpInside)
|
|
||||||
|
|
||||||
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressed(_:)))
|
let longPressGesture = UILongPressGestureRecognizer(target: self, action: #selector(self.longPressed(_:)))
|
||||||
longPressGesture.delegate = self
|
longPressGesture.delegate = self
|
||||||
self.addGestureRecognizer(longPressGesture)
|
self.addGestureRecognizer(longPressGesture)
|
||||||
|
|
||||||
|
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
|
||||||
|
self.addGestureRecognizer(tapGesture)
|
||||||
|
|
||||||
let maskImage = generateImage(CGSize(width: 100.0, height: 50.0), rotatedContext: { size, context in
|
let maskImage = generateImage(CGSize(width: 100.0, height: 50.0), rotatedContext: { size, context in
|
||||||
context.clear(CGRect(origin: .zero, size: size))
|
context.clear(CGRect(origin: .zero, size: size))
|
||||||
|
|
||||||
@ -331,13 +324,20 @@ final class VideoScrubberComponent: Component {
|
|||||||
component.audioLongPressed?(self.audioClippingView)
|
component.audioLongPressed?(self.audioClippingView)
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func audioButtonPressed() {
|
@objc private func handleTap(_ gestureRecognizer: UITapGestureRecognizer) {
|
||||||
self.isAudioSelected = true
|
guard let component = self.component, component.audioData != nil && !component.audioOnly else {
|
||||||
self.state?.updated(transition: .easeInOut(duration: 0.25))
|
return
|
||||||
}
|
}
|
||||||
|
let location = gestureRecognizer.location(in: self)
|
||||||
@objc private func videoButtonPressed() {
|
if location.y < self.frame.height / 2.0 {
|
||||||
self.isAudioSelected = false
|
if self.isAudioSelected {
|
||||||
|
component.audioLongPressed?(self.audioClippingView)
|
||||||
|
} else {
|
||||||
|
self.isAudioSelected = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
self.isAudioSelected = false
|
||||||
|
}
|
||||||
self.state?.updated(transition: .easeInOut(duration: 0.25))
|
self.state?.updated(transition: .easeInOut(duration: 0.25))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -369,10 +369,10 @@ final class VideoScrubberComponent: Component {
|
|||||||
private func cursorFrame(size: CGSize, height: CGFloat, position: Double, duration : Double) -> CGRect {
|
private func cursorFrame(size: CGSize, height: CGFloat, position: Double, duration : Double) -> CGRect {
|
||||||
let cursorPadding: CGFloat = 8.0
|
let cursorPadding: CGFloat = 8.0
|
||||||
let cursorPositionFraction = duration > 0.0 ? position / duration : 0.0
|
let cursorPositionFraction = duration > 0.0 ? position / duration : 0.0
|
||||||
let cursorPosition = floorToScreenPixels(handleWidth + handleWidth / 2.0 - cursorPadding + (size.width - handleWidth * 3.0 + cursorPadding * 2.0) * cursorPositionFraction)
|
let cursorPosition = floorToScreenPixels(handleWidth - 1.0 + (size.width - handleWidth * 2.0 + 2.0) * cursorPositionFraction)
|
||||||
var cursorFrame = CGRect(origin: CGPoint(x: cursorPosition - handleWidth / 2.0, y: -5.0 - UIScreenPixel), size: CGSize(width: handleWidth, height: height))
|
var cursorFrame = CGRect(origin: CGPoint(x: cursorPosition - handleWidth / 2.0, y: -5.0 - UIScreenPixel), size: CGSize(width: handleWidth, height: height))
|
||||||
cursorFrame.origin.x = max(self.trimView.leftHandleView.frame.maxX - cursorPadding, cursorFrame.origin.x)
|
cursorFrame.origin.x = max(self.trimView.leftHandleView.frame.maxX - cursorPadding, cursorFrame.origin.x)
|
||||||
cursorFrame.origin.x = min(self.trimView.rightHandleView.frame.minX + cursorPadding, cursorFrame.origin.x)
|
cursorFrame.origin.x = min(self.trimView.rightHandleView.frame.minX - handleWidth + cursorPadding, cursorFrame.origin.x)
|
||||||
return cursorFrame
|
return cursorFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -465,8 +465,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
self.isAudioSelected = false
|
self.isAudioSelected = false
|
||||||
}
|
}
|
||||||
audioTransition.setAlpha(view: self.audioClippingView, alpha: audioAlpha)
|
audioTransition.setAlpha(view: self.audioClippingView, alpha: audioAlpha)
|
||||||
self.audioButton.isUserInteractionEnabled = component.audioData != nil && !component.audioOnly && !self.isAudioSelected
|
|
||||||
self.videoButton.isUserInteractionEnabled = component.audioData != nil && !component.audioOnly && self.isAudioSelected
|
|
||||||
|
|
||||||
var audioClipOrigin: CGFloat = 0.0
|
var audioClipOrigin: CGFloat = 0.0
|
||||||
var audioClipWidth = availableSize.width + 18.0
|
var audioClipWidth = availableSize.width + 18.0
|
||||||
@ -490,7 +488,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let audioClippingFrame = CGRect(origin: CGPoint(x: audioClipOrigin, y: 0.0), size: CGSize(width: audioClipWidth, height: audioScrubberHeight))
|
let audioClippingFrame = CGRect(origin: CGPoint(x: audioClipOrigin, y: 0.0), size: CGSize(width: audioClipWidth, height: audioScrubberHeight))
|
||||||
audioTransition.setFrame(view: self.audioButton, frame: audioClippingFrame)
|
|
||||||
audioTransition.setFrame(view: self.audioClippingView, frame: audioClippingFrame)
|
audioTransition.setFrame(view: self.audioClippingView, frame: audioClippingFrame)
|
||||||
|
|
||||||
audioTransition.setCornerRadius(layer: self.audioClippingView.layer, cornerRadius: self.isAudioSelected ? 0.0 : 9.0)
|
audioTransition.setCornerRadius(layer: self.audioClippingView.layer, cornerRadius: self.isAudioSelected ? 0.0 : 9.0)
|
||||||
@ -675,12 +672,17 @@ final class VideoScrubberComponent: Component {
|
|||||||
containerRightEdge = ghostRightHandleFrame.minX
|
containerRightEdge = ghostRightHandleFrame.minX
|
||||||
}
|
}
|
||||||
|
|
||||||
|
transition.setAlpha(view: self.cursorView, alpha: self.trimView.isPanningTrimHandle || self.ghostTrimView.isPanningTrimHandle ? 0.0 : 1.0)
|
||||||
if self.isPanningPositionHandle || !component.isPlaying {
|
if self.isPanningPositionHandle || !component.isPlaying {
|
||||||
self.positionAnimation = nil
|
self.positionAnimation = nil
|
||||||
self.displayLink?.isPaused = true
|
self.displayLink?.isPaused = true
|
||||||
|
|
||||||
let cursorHeight: CGFloat = component.audioData != nil ? 80.0 : 50.0
|
let cursorHeight: CGFloat = component.audioData != nil ? 80.0 : 50.0
|
||||||
videoTransition.setFrame(view: self.cursorView, frame: cursorFrame(size: scrubberSize, height: cursorHeight, position: component.position, duration: component.duration))
|
var cursorPosition = component.position
|
||||||
|
if self.cursorView.alpha.isZero {
|
||||||
|
cursorPosition = component.startPosition
|
||||||
|
}
|
||||||
|
videoTransition.setFrame(view: self.cursorView, frame: cursorFrame(size: scrubberSize, height: cursorHeight, position: cursorPosition, duration: component.duration))
|
||||||
} else {
|
} else {
|
||||||
if let (_, _, end, ended) = self.positionAnimation {
|
if let (_, _, end, ended) = self.positionAnimation {
|
||||||
if ended, component.position >= component.startPosition && component.position < end - 1.0 {
|
if ended, component.position >= component.startPosition && component.position < end - 1.0 {
|
||||||
@ -692,7 +694,6 @@ final class VideoScrubberComponent: Component {
|
|||||||
self.displayLink?.isPaused = false
|
self.displayLink?.isPaused = false
|
||||||
self.updateCursorPosition()
|
self.updateCursorPosition()
|
||||||
}
|
}
|
||||||
// transition.setAlpha(view: self.cursorView, alpha: self.isPanningTrimHandle ? 0.0 : 1.0)
|
|
||||||
|
|
||||||
videoTransition.setFrame(view: self.trimView, frame: bounds.offsetBy(dx: 0.0, dy: self.isAudioSelected ? 0.0 : originY))
|
videoTransition.setFrame(view: self.trimView, frame: bounds.offsetBy(dx: 0.0, dy: self.isAudioSelected ? 0.0 : originY))
|
||||||
|
|
||||||
@ -705,9 +706,7 @@ final class VideoScrubberComponent: Component {
|
|||||||
videoTransition.setBounds(view: self.opaqueFramesContainer, bounds: CGRect(origin: CGPoint(x: containerLeftEdge - handleInset, y: 0.0), size: CGSize(width: containerRightEdge - containerLeftEdge + handleInset * 2.0, height: videoScrubberHeight)))
|
videoTransition.setBounds(view: self.opaqueFramesContainer, bounds: CGRect(origin: CGPoint(x: containerLeftEdge - handleInset, y: 0.0), size: CGSize(width: containerRightEdge - containerLeftEdge + handleInset * 2.0, height: videoScrubberHeight)))
|
||||||
|
|
||||||
videoTransition.setCornerRadius(layer: self.opaqueFramesContainer.layer, cornerRadius: self.isAudioSelected ? 9.0 : 0.0)
|
videoTransition.setCornerRadius(layer: self.opaqueFramesContainer.layer, cornerRadius: self.isAudioSelected ? 9.0 : 0.0)
|
||||||
|
|
||||||
videoTransition.setFrame(view: self.videoButton, frame: bounds.offsetBy(dx: 0.0, dy: originY))
|
|
||||||
|
|
||||||
var frameAspectRatio = 0.66
|
var frameAspectRatio = 0.66
|
||||||
if let image = component.frames.first, image.size.height > 0.0 {
|
if let image = component.frames.first, image.size.height > 0.0 {
|
||||||
frameAspectRatio = max(0.66, image.size.width / image.size.height)
|
frameAspectRatio = max(0.66, image.size.width / image.size.height)
|
||||||
@ -756,7 +755,7 @@ private class TrimView: UIView {
|
|||||||
private let leftCapsuleView = UIView()
|
private let leftCapsuleView = UIView()
|
||||||
private let rightCapsuleView = UIView()
|
private let rightCapsuleView = UIView()
|
||||||
|
|
||||||
private var isPanningTrimHandle = false
|
fileprivate var isPanningTrimHandle = false
|
||||||
|
|
||||||
var trimUpdated: (Double, Double, Bool, Bool) -> Void = { _, _, _, _ in }
|
var trimUpdated: (Double, Double, Bool, Bool) -> Void = { _, _, _, _ in }
|
||||||
var updated: (Transition) -> Void = { _ in }
|
var updated: (Transition) -> Void = { _ in }
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user