mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-22 14:20:20 +00:00
Camera and editor fixes
This commit is contained in:
@@ -305,8 +305,8 @@ private final class CameraScreenComponent: CombinedComponent {
|
||||
self.cameraState = self.cameraState.updatedRecording(.none).updatedDuration(0.0)
|
||||
self.resultDisposable.set((self.camera.stopRecording()
|
||||
|> deliverOnMainQueue).start(next: { [weak self] result in
|
||||
if let self, case let .finished(mainResult, additionalResult, _) = result {
|
||||
self.completion.invoke(.single(.video(mainResult.0, mainResult.1, additionalResult?.0, additionalResult?.1, PixelDimensions(width: 1080, height: 1920), .bottomRight)))
|
||||
if let self, case let .finished(mainResult, additionalResult, duration, positionChangeTimestamps, _) = result {
|
||||
self.completion.invoke(.single(.video(mainResult.0, mainResult.1, additionalResult?.0, additionalResult?.1, PixelDimensions(width: 1080, height: 1920), duration, positionChangeTimestamps, .bottomRight)))
|
||||
}
|
||||
}))
|
||||
self.isTransitioning = true
|
||||
@@ -741,8 +741,6 @@ private final class CameraScreenComponent: CombinedComponent {
|
||||
}
|
||||
}
|
||||
|
||||
private let useSimplePreviewView = true
|
||||
|
||||
private class BlurView: UIVisualEffectView {
|
||||
private func setup() {
|
||||
for subview in self.subviews {
|
||||
@@ -803,7 +801,7 @@ public class CameraScreen: ViewController {
|
||||
public enum Result {
|
||||
case pendingImage
|
||||
case image(UIImage, UIImage?, CameraScreen.PIPPosition)
|
||||
case video(String, UIImage?, String?, UIImage?, PixelDimensions, CameraScreen.PIPPosition)
|
||||
case video(String, UIImage?, String?, UIImage?, PixelDimensions, Double, [(Bool, Double)], CameraScreen.PIPPosition)
|
||||
case asset(PHAsset)
|
||||
case draft(MediaEditorDraft)
|
||||
|
||||
@@ -811,8 +809,8 @@ public class CameraScreen: ViewController {
|
||||
switch self {
|
||||
case let .image(mainImage, additionalImage, _):
|
||||
return .image(mainImage, additionalImage, position)
|
||||
case let .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, _):
|
||||
return .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, position)
|
||||
case let .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, duration, positionChangeTimestamps, _):
|
||||
return .video(mainPath, mainImage, additionalPath, additionalImage, dimensions, duration, positionChangeTimestamps, position)
|
||||
default:
|
||||
return self
|
||||
}
|
||||
@@ -860,11 +858,15 @@ public class CameraScreen: ViewController {
|
||||
fileprivate let containerView: UIView
|
||||
fileprivate let componentHost: ComponentView<ViewControllerComponentContainer.Environment>
|
||||
private let previewContainerView: UIView
|
||||
fileprivate let previewView: CameraPreviewView?
|
||||
fileprivate let simplePreviewView: CameraSimplePreviewView?
|
||||
fileprivate var additionalPreviewView: CameraSimplePreviewView?
|
||||
|
||||
private let mainPreviewContainerView: UIView
|
||||
fileprivate var mainPreviewView: CameraSimplePreviewView
|
||||
|
||||
private let additionalPreviewContainerView: UIView
|
||||
fileprivate var additionalPreviewView: CameraSimplePreviewView
|
||||
|
||||
fileprivate let previewBlurView: BlurView
|
||||
private var previewSnapshotView: UIView?
|
||||
private var mainPreviewSnapshotView: UIView?
|
||||
private var additionalPreviewSnapshotView: UIView?
|
||||
fileprivate let previewFrameLeftDimView: UIView
|
||||
fileprivate let previewFrameRightDimView: UIView
|
||||
@@ -881,47 +883,7 @@ public class CameraScreen: ViewController {
|
||||
private var cameraPosition: Camera.Position = .back
|
||||
|
||||
private let completion = ActionSlot<Signal<CameraScreen.Result, NoError>>()
|
||||
|
||||
private var effectivePreviewView: UIView {
|
||||
if let simplePreviewView = self.simplePreviewView {
|
||||
return simplePreviewView
|
||||
} else if let previewView = self.previewView {
|
||||
return previewView
|
||||
} else {
|
||||
fatalError()
|
||||
}
|
||||
}
|
||||
|
||||
private var currentPreviewView: UIView {
|
||||
if let simplePreviewView = self.simplePreviewView {
|
||||
if let additionalPreviewView = self.additionalPreviewView {
|
||||
if self.isDualCamEnabled && cameraPosition == .front {
|
||||
return additionalPreviewView
|
||||
} else {
|
||||
return simplePreviewView
|
||||
}
|
||||
} else {
|
||||
return simplePreviewView
|
||||
}
|
||||
} else if let previewView = self.previewView {
|
||||
return previewView
|
||||
} else {
|
||||
fatalError()
|
||||
}
|
||||
}
|
||||
|
||||
private var currentAdditionalPreviewView: UIView? {
|
||||
if let additionalPreviewView = self.additionalPreviewView {
|
||||
if self.isDualCamEnabled && cameraPosition == .front {
|
||||
return self.simplePreviewView
|
||||
} else {
|
||||
return additionalPreviewView
|
||||
}
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fileprivate var previewBlurPromise = ValuePromise<Bool>(false)
|
||||
|
||||
private let flipAnimationAction = ActionSlot<Void>()
|
||||
@@ -953,36 +915,22 @@ public class CameraScreen: ViewController {
|
||||
self.previewBlurView = BlurView()
|
||||
self.previewBlurView.isUserInteractionEnabled = false
|
||||
|
||||
if let holder = controller.holder {
|
||||
self.simplePreviewView = nil
|
||||
self.previewView = holder.previewView
|
||||
self.camera = holder.camera
|
||||
} else {
|
||||
if useSimplePreviewView {
|
||||
self.simplePreviewView = CameraSimplePreviewView(frame: .zero, additional: false)
|
||||
self.previewView = nil
|
||||
|
||||
self.additionalPreviewView = CameraSimplePreviewView(frame: .zero, additional: true)
|
||||
self.additionalPreviewView?.clipsToBounds = true
|
||||
} else {
|
||||
self.previewView = CameraPreviewView(test: false)!
|
||||
self.simplePreviewView = nil
|
||||
}
|
||||
|
||||
var cameraFrontPosition = false
|
||||
if let useCameraFrontPosition = UserDefaults.standard.object(forKey: "TelegramStoryCameraUseFrontPosition") as? NSNumber, useCameraFrontPosition.boolValue {
|
||||
cameraFrontPosition = true
|
||||
}
|
||||
|
||||
self.cameraPosition = cameraFrontPosition ? .front : .back
|
||||
self.camera = Camera(configuration: Camera.Configuration(preset: .hd1920x1080, position: self.cameraPosition, audio: true, photo: true, metadata: false, preferredFps: 60.0), previewView: self.simplePreviewView, secondaryPreviewView: self.additionalPreviewView)
|
||||
if !useSimplePreviewView {
|
||||
#if targetEnvironment(simulator)
|
||||
#else
|
||||
self.camera.attachPreviewView(self.previewView!)
|
||||
#endif
|
||||
}
|
||||
self.mainPreviewContainerView = UIView()
|
||||
self.mainPreviewContainerView.clipsToBounds = true
|
||||
self.mainPreviewView = CameraSimplePreviewView(frame: .zero, main: true)
|
||||
|
||||
self.additionalPreviewContainerView = UIView()
|
||||
self.additionalPreviewContainerView.clipsToBounds = true
|
||||
self.additionalPreviewView = CameraSimplePreviewView(frame: .zero, main: false)
|
||||
|
||||
var cameraFrontPosition = false
|
||||
if let useCameraFrontPosition = UserDefaults.standard.object(forKey: "TelegramStoryCameraUseFrontPosition") as? NSNumber, useCameraFrontPosition.boolValue {
|
||||
cameraFrontPosition = true
|
||||
}
|
||||
self.mainPreviewView.resetPlaceholder(front: cameraFrontPosition)
|
||||
|
||||
self.cameraPosition = cameraFrontPosition ? .front : .back
|
||||
self.camera = Camera(configuration: Camera.Configuration(preset: .hd1920x1080, position: self.cameraPosition, audio: true, photo: true, metadata: false, preferredFps: 60.0), previewView: self.mainPreviewView, secondaryPreviewView: self.additionalPreviewView)
|
||||
|
||||
self.previewFrameLeftDimView = UIView()
|
||||
self.previewFrameLeftDimView.backgroundColor = UIColor(rgb: 0x000000, alpha: 0.6)
|
||||
@@ -1006,17 +954,17 @@ public class CameraScreen: ViewController {
|
||||
self.view.addSubview(self.containerView)
|
||||
|
||||
self.containerView.addSubview(self.previewContainerView)
|
||||
self.previewContainerView.addSubview(self.effectivePreviewView)
|
||||
self.previewContainerView.addSubview(self.mainPreviewContainerView)
|
||||
self.previewContainerView.addSubview(self.additionalPreviewContainerView)
|
||||
self.previewContainerView.addSubview(self.previewBlurView)
|
||||
self.previewContainerView.addSubview(self.previewFrameLeftDimView)
|
||||
self.previewContainerView.addSubview(self.previewFrameRightDimView)
|
||||
self.containerView.addSubview(self.transitionDimView)
|
||||
self.view.addSubview(self.transitionCornersView)
|
||||
|
||||
if let additionalPreviewView = self.additionalPreviewView {
|
||||
self.previewContainerView.insertSubview(additionalPreviewView, at: 1)
|
||||
}
|
||||
|
||||
self.mainPreviewContainerView.addSubview(self.mainPreviewView)
|
||||
self.additionalPreviewContainerView.addSubview(self.additionalPreviewView)
|
||||
|
||||
self.changingPositionDisposable = combineLatest(
|
||||
queue: Queue.mainQueue(),
|
||||
self.camera.modeChange,
|
||||
@@ -1024,18 +972,36 @@ public class CameraScreen: ViewController {
|
||||
).start(next: { [weak self] modeChange, forceBlur in
|
||||
if let self {
|
||||
if modeChange != .none {
|
||||
if let snapshot = self.simplePreviewView?.snapshotView(afterScreenUpdates: false) {
|
||||
self.simplePreviewView?.addSubview(snapshot)
|
||||
self.previewSnapshotView = snapshot
|
||||
// if case .dualCamera = modeChange, self.cameraPosition == .front {
|
||||
// if self.isDualCamEnabled {
|
||||
// if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
// snapshot.frame = CGRect(origin: .zero, size: self.mainPreviewContainerView.bounds.size)
|
||||
// self.mainPreviewView.addSubview(snapshot)
|
||||
// self.previewSnapshotView = snapshot
|
||||
// }
|
||||
// } else {
|
||||
// if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
// snapshot.frame = CGRect(origin: .zero, size: self.mainPreviewContainerView.bounds.size)
|
||||
// self.additionalPreviewView.addSubview(snapshot)
|
||||
// self.additionalPreviewSnapshotView = snapshot
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
if case .dualCamera = modeChange, self.cameraPosition == .front {
|
||||
|
||||
} else {
|
||||
if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
self.mainPreviewView.addSubview(snapshot)
|
||||
self.mainPreviewSnapshotView = snapshot
|
||||
}
|
||||
}
|
||||
if case .position = modeChange {
|
||||
UIView.transition(with: self.previewContainerView, duration: 0.4, options: [.transitionFlipFromLeft, .curveEaseOut], animations: {
|
||||
self.previewBlurView.effect = UIBlurEffect(style: .dark)
|
||||
})
|
||||
} else {
|
||||
if let additionalPreviewView = self.additionalPreviewView {
|
||||
self.previewContainerView.insertSubview(self.previewBlurView, belowSubview: additionalPreviewView)
|
||||
}
|
||||
self.previewContainerView.insertSubview(self.previewBlurView, belowSubview: self.additionalPreviewContainerView)
|
||||
|
||||
UIView.animate(withDuration: 0.4) {
|
||||
self.previewBlurView.effect = UIBlurEffect(style: .dark)
|
||||
}
|
||||
@@ -1045,16 +1011,16 @@ public class CameraScreen: ViewController {
|
||||
self.previewBlurView.effect = UIBlurEffect(style: .dark)
|
||||
}
|
||||
} else {
|
||||
UIView.animate(withDuration: 0.4, animations: {
|
||||
self.previewBlurView.effect = nil
|
||||
}, completion: { _ in
|
||||
if let additionalPreviewView = self.additionalPreviewView {
|
||||
self.previewContainerView.insertSubview(self.previewBlurView, aboveSubview: additionalPreviewView)
|
||||
}
|
||||
})
|
||||
if self.previewBlurView.effect != nil {
|
||||
UIView.animate(withDuration: 0.4, animations: {
|
||||
self.previewBlurView.effect = nil
|
||||
}, completion: { _ in
|
||||
self.previewContainerView.insertSubview(self.previewBlurView, aboveSubview: self.additionalPreviewContainerView)
|
||||
})
|
||||
}
|
||||
|
||||
if let previewSnapshotView = self.previewSnapshotView {
|
||||
self.previewSnapshotView = nil
|
||||
if let previewSnapshotView = self.mainPreviewSnapshotView {
|
||||
self.mainPreviewSnapshotView = nil
|
||||
UIView.animate(withDuration: 0.25, animations: {
|
||||
previewSnapshotView.alpha = 0.0
|
||||
}, completion: { _ in
|
||||
@@ -1072,7 +1038,8 @@ public class CameraScreen: ViewController {
|
||||
}
|
||||
|
||||
if self.isDualCamEnabled {
|
||||
self.additionalPreviewView?.removePlaceholder()
|
||||
self.mainPreviewView.removePlaceholder()
|
||||
self.additionalPreviewView.removePlaceholder()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1093,9 +1060,9 @@ public class CameraScreen: ViewController {
|
||||
}
|
||||
if case .pendingImage = value {
|
||||
Queue.mainQueue().async {
|
||||
self.simplePreviewView?.isEnabled = false
|
||||
self.mainPreviewView.isEnabled = false
|
||||
|
||||
self.additionalPreviewView?.isEnabled = false
|
||||
self.additionalPreviewView.isEnabled = false
|
||||
}
|
||||
} else {
|
||||
Queue.mainQueue().async {
|
||||
@@ -1104,8 +1071,8 @@ public class CameraScreen: ViewController {
|
||||
self.previewBlurPromise.set(true)
|
||||
}
|
||||
}
|
||||
self.simplePreviewView?.isEnabled = false
|
||||
self.additionalPreviewView?.isEnabled = false
|
||||
self.mainPreviewView.isEnabled = false
|
||||
self.additionalPreviewView.isEnabled = false
|
||||
self.camera.stopCapture()
|
||||
}
|
||||
}
|
||||
@@ -1119,25 +1086,32 @@ public class CameraScreen: ViewController {
|
||||
self.updateState.connect { [weak self] state in
|
||||
if let self {
|
||||
let previousPosition = self.cameraPosition
|
||||
self.cameraPosition = state.position
|
||||
let newPosition = state.position != .unspecified ? state.position : previousPosition
|
||||
self.cameraPosition = newPosition
|
||||
|
||||
let dualCamWasEnabled = self.isDualCamEnabled
|
||||
self.isDualCamEnabled = state.isDualCamEnabled
|
||||
|
||||
if self.isDualCamEnabled && previousPosition != state.position, let additionalPreviewView = self.additionalPreviewView {
|
||||
if state.position == .front {
|
||||
additionalPreviewView.superview?.sendSubviewToBack(additionalPreviewView)
|
||||
if self.isDualCamEnabled != dualCamWasEnabled && newPosition == .front {
|
||||
if self.isDualCamEnabled {
|
||||
if let cloneView = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
self.mainPreviewSnapshotView = cloneView
|
||||
self.mainPreviewContainerView.addSubview(cloneView)
|
||||
}
|
||||
} else {
|
||||
additionalPreviewView.superview?.insertSubview(additionalPreviewView, aboveSubview: self.simplePreviewView!)
|
||||
if let cloneView = self.additionalPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
self.mainPreviewSnapshotView = cloneView
|
||||
self.mainPreviewContainerView.addSubview(cloneView)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if self.isDualCamEnabled && previousPosition != newPosition {
|
||||
CATransaction.begin()
|
||||
CATransaction.setDisableActions(true)
|
||||
self.requestUpdateLayout(hasAppeared: false, transition: .immediate)
|
||||
CATransaction.commit()
|
||||
} else {
|
||||
if !dualCamWasEnabled && self.isDualCamEnabled {
|
||||
|
||||
}
|
||||
} else if dualCamWasEnabled != self.isDualCamEnabled {
|
||||
self.requestUpdateLayout(hasAppeared: false, transition: .spring(duration: 0.4))
|
||||
}
|
||||
}
|
||||
@@ -1155,17 +1129,17 @@ public class CameraScreen: ViewController {
|
||||
self.view.disablesInteractiveKeyboardGestureRecognizer = true
|
||||
|
||||
let pinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: #selector(self.handlePinch(_:)))
|
||||
self.effectivePreviewView.addGestureRecognizer(pinchGestureRecognizer)
|
||||
self.mainPreviewContainerView.addGestureRecognizer(pinchGestureRecognizer)
|
||||
|
||||
let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
|
||||
panGestureRecognizer.maximumNumberOfTouches = 1
|
||||
self.effectivePreviewView.addGestureRecognizer(panGestureRecognizer)
|
||||
self.mainPreviewContainerView.addGestureRecognizer(panGestureRecognizer)
|
||||
|
||||
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(_:)))
|
||||
self.effectivePreviewView.addGestureRecognizer(tapGestureRecognizer)
|
||||
self.mainPreviewContainerView.addGestureRecognizer(tapGestureRecognizer)
|
||||
|
||||
let pipPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(self.handlePipPan(_:)))
|
||||
self.additionalPreviewView?.addGestureRecognizer(pipPanGestureRecognizer)
|
||||
self.additionalPreviewContainerView.addGestureRecognizer(pipPanGestureRecognizer)
|
||||
|
||||
self.camera.focus(at: CGPoint(x: 0.5, y: 0.5), autoFocus: true)
|
||||
self.camera.startCapture()
|
||||
@@ -1217,11 +1191,8 @@ public class CameraScreen: ViewController {
|
||||
}
|
||||
|
||||
@objc private func handleTap(_ gestureRecognizer: UITapGestureRecognizer) {
|
||||
guard let previewView = self.simplePreviewView else {
|
||||
return
|
||||
}
|
||||
let location = gestureRecognizer.location(in: previewView)
|
||||
let point = previewView.cameraPoint(for: location)
|
||||
let location = gestureRecognizer.location(in: mainPreviewView)
|
||||
let point = mainPreviewView.cameraPoint(for: location)
|
||||
self.camera.focus(at: point, autoFocus: false)
|
||||
}
|
||||
|
||||
@@ -1347,8 +1318,8 @@ public class CameraScreen: ViewController {
|
||||
}
|
||||
|
||||
func pauseCameraCapture() {
|
||||
self.simplePreviewView?.isEnabled = false
|
||||
self.additionalPreviewView?.isEnabled = false
|
||||
self.mainPreviewView.isEnabled = false
|
||||
self.additionalPreviewView.isEnabled = false
|
||||
Queue.mainQueue().after(0.3) {
|
||||
self.previewBlurPromise.set(true)
|
||||
}
|
||||
@@ -1356,21 +1327,21 @@ public class CameraScreen: ViewController {
|
||||
}
|
||||
|
||||
func resumeCameraCapture() {
|
||||
if self.simplePreviewView?.isEnabled == false {
|
||||
if let snapshot = self.simplePreviewView?.snapshotView(afterScreenUpdates: false) {
|
||||
self.simplePreviewView?.addSubview(snapshot)
|
||||
self.previewSnapshotView = snapshot
|
||||
if !self.mainPreviewView.isEnabled {
|
||||
if let snapshot = self.mainPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
self.mainPreviewView.addSubview(snapshot)
|
||||
self.mainPreviewSnapshotView = snapshot
|
||||
}
|
||||
if let snapshot = self.additionalPreviewView?.snapshotView(afterScreenUpdates: false) {
|
||||
self.additionalPreviewView?.addSubview(snapshot)
|
||||
if let snapshot = self.additionalPreviewView.snapshotView(afterScreenUpdates: false) {
|
||||
self.additionalPreviewView.addSubview(snapshot)
|
||||
self.additionalPreviewSnapshotView = snapshot
|
||||
}
|
||||
self.simplePreviewView?.isEnabled = true
|
||||
self.additionalPreviewView?.isEnabled = true
|
||||
self.mainPreviewView.isEnabled = true
|
||||
self.additionalPreviewView.isEnabled = true
|
||||
self.camera.startCapture()
|
||||
|
||||
if #available(iOS 13.0, *), let isPreviewing = self.simplePreviewView?.isPreviewing {
|
||||
let _ = (isPreviewing
|
||||
if #available(iOS 13.0, *) {
|
||||
let _ = (self.mainPreviewView.isPreviewing
|
||||
|> filter {
|
||||
$0
|
||||
}
|
||||
@@ -1467,10 +1438,10 @@ public class CameraScreen: ViewController {
|
||||
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
|
||||
let result = super.hitTest(point, with: event)
|
||||
if result == self.componentHost.view {
|
||||
if let additionalPreviewView = self.additionalPreviewView, additionalPreviewView.bounds.contains(self.view.convert(point, to: additionalPreviewView)) {
|
||||
return additionalPreviewView
|
||||
if self.additionalPreviewView.bounds.contains(self.view.convert(point, to: self.additionalPreviewView)) {
|
||||
return self.additionalPreviewView
|
||||
} else {
|
||||
return self.effectivePreviewView
|
||||
return self.mainPreviewView
|
||||
}
|
||||
}
|
||||
return result
|
||||
@@ -1569,7 +1540,7 @@ public class CameraScreen: ViewController {
|
||||
panelWidth: panelWidth,
|
||||
flipAnimationAction: self.flipAnimationAction,
|
||||
animateShutter: { [weak self] in
|
||||
self?.effectivePreviewView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
|
||||
self?.mainPreviewContainerView.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.25)
|
||||
},
|
||||
present: { [weak self] c in
|
||||
self?.controller?.present(c, in: .window(.root))
|
||||
@@ -1605,58 +1576,77 @@ public class CameraScreen: ViewController {
|
||||
transition.setFrame(view: self.transitionDimView, frame: CGRect(origin: .zero, size: layout.size))
|
||||
|
||||
transition.setFrame(view: self.previewContainerView, frame: previewFrame)
|
||||
self.currentPreviewView.layer.cornerRadius = 0.0
|
||||
transition.setFrame(view: self.currentPreviewView, frame: CGRect(origin: .zero, size: previewFrame.size))
|
||||
transition.setFrame(view: self.mainPreviewContainerView, frame: CGRect(origin: .zero, size: previewFrame.size))
|
||||
|
||||
transition.setFrame(view: self.previewBlurView, frame: CGRect(origin: .zero, size: previewFrame.size))
|
||||
|
||||
if let additionalPreviewView = self.currentAdditionalPreviewView as? CameraSimplePreviewView {
|
||||
let dualCamUpdated = self.appliedDualCam != self.isDualCamEnabled
|
||||
self.appliedDualCam = self.isDualCamEnabled
|
||||
|
||||
additionalPreviewView.layer.cornerRadius = 80.0
|
||||
|
||||
var origin: CGPoint
|
||||
switch self.pipPosition {
|
||||
case .topLeft:
|
||||
origin = CGPoint(x: 10.0, y: 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
|
||||
}
|
||||
case .topRight:
|
||||
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
|
||||
}
|
||||
case .bottomLeft:
|
||||
origin = CGPoint(x: 10.0, y: previewFrame.height - 160.0 - 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
|
||||
}
|
||||
case .bottomRight:
|
||||
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: previewFrame.height - 160.0 - 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
|
||||
}
|
||||
let dualCamUpdated = self.appliedDualCam != self.isDualCamEnabled
|
||||
self.appliedDualCam = self.isDualCamEnabled
|
||||
|
||||
var origin: CGPoint
|
||||
switch self.pipPosition {
|
||||
case .topLeft:
|
||||
origin = CGPoint(x: 10.0, y: 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
|
||||
}
|
||||
|
||||
if let pipTranslation = self.pipTranslation {
|
||||
origin = origin.offsetBy(dx: pipTranslation.x, dy: pipTranslation.y)
|
||||
case .topRight:
|
||||
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
|
||||
}
|
||||
|
||||
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
|
||||
transition.setPosition(view: additionalPreviewView, position: additionalPreviewFrame.center)
|
||||
transition.setBounds(view: additionalPreviewView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
|
||||
|
||||
transition.setScale(view: additionalPreviewView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
|
||||
transition.setAlpha(view: additionalPreviewView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
|
||||
|
||||
if dualCamUpdated && !self.isDualCamEnabled {
|
||||
Queue.mainQueue().after(0.5) {
|
||||
additionalPreviewView.resetPlaceholder()
|
||||
}
|
||||
case .bottomLeft:
|
||||
origin = CGPoint(x: 10.0, y: previewFrame.height - 160.0 - 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: -180.0, dy: 0.0)
|
||||
}
|
||||
case .bottomRight:
|
||||
origin = CGPoint(x: previewFrame.width - 160.0 - 10.0, y: previewFrame.height - 160.0 - 110.0)
|
||||
if !self.isDualCamEnabled {
|
||||
origin = origin.offsetBy(dx: 180.0, dy: 0.0)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if let pipTranslation = self.pipTranslation {
|
||||
origin = origin.offsetBy(dx: pipTranslation.x, dy: pipTranslation.y)
|
||||
}
|
||||
|
||||
let additionalPreviewFrame = CGRect(origin: origin, size: CGSize(width: 160.0, height: 160.0))
|
||||
transition.setPosition(view: self.additionalPreviewContainerView, position: additionalPreviewFrame.center)
|
||||
transition.setBounds(view: self.additionalPreviewContainerView, bounds: CGRect(origin: .zero, size: additionalPreviewFrame.size))
|
||||
self.additionalPreviewContainerView.layer.cornerRadius = additionalPreviewFrame.width / 2.0
|
||||
|
||||
transition.setScale(view: self.additionalPreviewContainerView, scale: self.isDualCamEnabled ? 1.0 : 0.1)
|
||||
transition.setAlpha(view: self.additionalPreviewContainerView, alpha: self.isDualCamEnabled ? 1.0 : 0.0)
|
||||
|
||||
if dualCamUpdated && self.isDualCamEnabled {
|
||||
if self.cameraPosition == .back {
|
||||
self.additionalPreviewView.resetPlaceholder(front: true)
|
||||
} else {
|
||||
self.mainPreviewView.resetPlaceholder(front: false)
|
||||
}
|
||||
}
|
||||
|
||||
let mainPreviewView: CameraSimplePreviewView
|
||||
let additionalPreviewView: CameraSimplePreviewView
|
||||
if self.cameraPosition == .front && self.isDualCamEnabled {
|
||||
mainPreviewView = self.additionalPreviewView
|
||||
additionalPreviewView = self.mainPreviewView
|
||||
} else {
|
||||
mainPreviewView = self.mainPreviewView
|
||||
additionalPreviewView = self.additionalPreviewView
|
||||
}
|
||||
|
||||
if mainPreviewView.superview != self.mainPreviewContainerView {
|
||||
self.mainPreviewContainerView.insertSubview(mainPreviewView, at: 0)
|
||||
}
|
||||
if additionalPreviewView.superview != self.additionalPreviewContainerView {
|
||||
self.additionalPreviewContainerView.insertSubview(additionalPreviewView, at: 0)
|
||||
}
|
||||
|
||||
mainPreviewView.frame = CGRect(origin: .zero, size: previewFrame.size)
|
||||
additionalPreviewView.frame = CGRect(origin: .zero, size: additionalPreviewFrame.size)
|
||||
|
||||
self.previewFrameLeftDimView.isHidden = !isTablet
|
||||
transition.setFrame(view: self.previewFrameLeftDimView, frame: CGRect(origin: .zero, size: CGSize(width: viewfinderFrame.minX, height: viewfinderFrame.height)))
|
||||
|
||||
@@ -1780,6 +1770,7 @@ public class CameraScreen: ViewController {
|
||||
self.node.animateInFromEditor(toGallery: self.galleryController?.displayNode.supernode != nil)
|
||||
}
|
||||
|
||||
private var didStopCameraCapture = false
|
||||
func presentGallery(fromGesture: Bool = false) {
|
||||
if !fromGesture {
|
||||
self.hapticFeedback.impact(.light)
|
||||
@@ -1787,20 +1778,20 @@ public class CameraScreen: ViewController {
|
||||
|
||||
self.dismissAllTooltips()
|
||||
|
||||
var didStopCameraCapture = false
|
||||
self.didStopCameraCapture = false
|
||||
let stopCameraCapture = { [weak self] in
|
||||
guard !didStopCameraCapture, let self else {
|
||||
guard let self, !self.didStopCameraCapture else {
|
||||
return
|
||||
}
|
||||
didStopCameraCapture = true
|
||||
self.didStopCameraCapture = true
|
||||
self.node.pauseCameraCapture()
|
||||
}
|
||||
|
||||
let resumeCameraCapture = { [weak self] in
|
||||
guard didStopCameraCapture, let self else {
|
||||
guard let self, self.didStopCameraCapture else {
|
||||
return
|
||||
}
|
||||
didStopCameraCapture = false
|
||||
self.didStopCameraCapture = false
|
||||
self.node.resumeCameraCapture()
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user