@@ -36,7 +36,7 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
36
36
private let toggleButton : UIButton = UIButton . createCircleButton ( radius: 24 )
37
37
private let cameraIndicatorView : BibbiLoadingView = BibbiLoadingView ( )
38
38
private let filterView : UIImageView = UIImageView ( )
39
- private let zoomView : UIImageView = UIImageView ( )
39
+ private let zoomView : UIButton = UIButton ( )
40
40
private let realEmojiDescriptionLabel = BibbiLabel ( . body1Regular, textColor: . mainYellow)
41
41
private let realEmojiFaceView = UIView ( )
42
42
private let realEmojiFaceImageView = UIImageView ( )
@@ -71,7 +71,7 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
71
71
public override func setupUI( ) {
72
72
super. setupUI ( )
73
73
realEmojiFaceView. addSubview ( realEmojiFaceImageView)
74
- view. addSubviews ( cameraView, shutterButton, flashButton, toggleButton, realEmojiFaceView, realEmojiHorizontalStakView, realEmojiCollectionView, cameraIndicatorView , cameraNavigationBar)
74
+ view. addSubviews ( cameraView, shutterButton, flashButton, toggleButton, realEmojiFaceView, realEmojiHorizontalStakView, realEmojiCollectionView , cameraIndicatorView , cameraNavigationBar)
75
75
}
76
76
77
77
public override func setupAttributes( ) {
@@ -87,8 +87,8 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
87
87
}
88
88
89
89
zoomView. do {
90
- $0. image = DesignSystemAsset . zoom . image
91
- $0. contentMode = . scaleAspectFill
90
+ $0. setBackgroundImage ( DesignSystemAsset . zoomin . image, for : . normal )
91
+ $0. setTitle ( " " , for : . normal )
92
92
}
93
93
94
94
realEmojiFlowLayout. do {
@@ -109,7 +109,6 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
109
109
$0. clipsToBounds = true
110
110
$0. layer. cornerRadius = 35 / 2
111
111
$0. backgroundColor = DesignSystemAsset . gray600. color
112
- $0. clipsToBounds = true
113
112
}
114
113
115
114
realEmojiFaceImageView. do {
@@ -277,6 +276,41 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
277
276
NotificationCenter . default. post ( name: . DidFinishProfileImageUpdate, object: nil , userInfo: userInfo)
278
277
} . disposed ( by: disposeBag)
279
278
279
+ zoomView
280
+ . rx. tap
281
+ . map { _ in CGFloat ( 1.0 ) }
282
+ . map { Reactor . Action. didTapZoomButton ( $0) }
283
+ . bind ( to: reactor. action)
284
+ . disposed ( by: disposeBag)
285
+
286
+ reactor. pulse ( \. $zoomScale)
287
+ . withUnretained ( self )
288
+ . observe ( on: MainScheduler . instance)
289
+ . bind ( onNext: {
290
+ guard let currentCamera = $0. 0 . isToggle ? $0. 0 . frontCamera : $0. 0 . backCamera else { return }
291
+ $0. 0 . transitionZoomImageScale ( owner: $0. 0 , scale: $0. 1 , camera: currentCamera)
292
+ } ) . disposed ( by: disposeBag)
293
+
294
+ reactor. pulse ( \. $pinchZoomScale)
295
+ . withUnretained ( self )
296
+ . bind ( onNext: {
297
+ guard let currentCamera = $0. 0 . isToggle ? $0. 0 . frontCamera : $0. 0 . backCamera else { return }
298
+ $0. 0 . transitionPinchImageScale ( owner: $0. 0 , scale: $0. 1 , camera: currentCamera)
299
+ } ) . disposed ( by: disposeBag)
300
+
301
+ reactor. pulse ( \. $zoomScale)
302
+ . map { $0 == 2.0 ? DesignSystemAsset . zoomout. image : DesignSystemAsset . zoomin. image }
303
+ . observe ( on: MainScheduler . instance)
304
+ . withUnretained ( self )
305
+ . bind ( onNext: { $0. 0 . zoomView. setBackgroundImage ( $0. 1 , for: . normal) } )
306
+ . disposed ( by: disposeBag)
307
+
308
+ reactor. pulse ( \. $pinchZoomScale)
309
+ . map { $0 == 10.0 ? DesignSystemAsset . zoomout. image : DesignSystemAsset . zoomin. image }
310
+ . observe ( on: MainScheduler . instance)
311
+ . withUnretained ( self )
312
+ . bind ( onNext: { $0. 0 . zoomView. setBackgroundImage ( $0. 1 , for: . normal) } )
313
+ . disposed ( by: disposeBag)
280
314
281
315
reactor. state
282
316
. map { ( $0. accountImage, $0. profileImageURLEntity, $0. memberId) }
@@ -323,12 +357,10 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
323
357
324
358
cameraView. rx
325
359
. pinchGesture
326
- . withUnretained ( self )
327
- . observe ( on: MainScheduler . instance)
328
- . bind ( onNext: {
329
- guard let currentCamera = $0. 0 . isToggle ? $0. 0 . frontCamera : $0. 0 . backCamera else { return }
330
- $0. 0 . transitionImageScale ( owner: $0. 0 , gesture: $0. 1 , camera: currentCamera)
331
- } ) . disposed ( by: disposeBag)
360
+ . map { $0. scale }
361
+ . map { Reactor . Action. dragPreviewLayer ( $0) }
362
+ . bind ( to: reactor. action)
363
+ . disposed ( by: disposeBag)
332
364
333
365
334
366
toggleButton
@@ -530,25 +562,22 @@ extension CameraViewController: AVCapturePhotoCaptureDelegate {
530
562
self . navigationController? . popViewController ( animated: true )
531
563
}
532
564
533
- private func transitionImageScale( owner: CameraViewController , gesture: UIPinchGestureRecognizer , camera: AVCaptureDevice ) {
534
-
535
- switch gesture. state {
536
-
537
- case . began:
538
- owner. initialScale = camera. videoZoomFactor
539
-
540
- case . changed:
541
- let minAvailableZoomScale = camera. minAvailableVideoZoomFactor
542
- let maxAvailableZoomScale = camera. maxAvailableVideoZoomFactor
543
- let availableZoomScaleRange = minAvailableZoomScale... maxAvailableZoomScale
544
- let resolvedZoomScaleRange = zoomScaleRange. clamped ( to: availableZoomScaleRange)
545
-
546
- let resolvedScale = max ( resolvedZoomScaleRange. lowerBound, min ( gesture. scale * initialScale, resolvedZoomScaleRange. upperBound) )
547
- setupImageScale ( owner: owner, scale: resolvedScale, camera: camera)
548
- default :
549
- return
550
-
551
- }
565
+ private func transitionZoomImageScale( owner: CameraViewController , scale: CGFloat , camera: AVCaptureDevice ) {
566
+ let minAvailableZoomScale : CGFloat = 1.0
567
+ let maxAvailableZoomScale : CGFloat = 2.0
568
+ let availableZoomScaleRange = minAvailableZoomScale... maxAvailableZoomScale
569
+ let resolvedZoomScaleRange = zoomScaleRange. clamped ( to: availableZoomScaleRange)
570
+ let resolvedScale = max ( resolvedZoomScaleRange. lowerBound, min ( scale, resolvedZoomScaleRange. upperBound) )
571
+ setupImageScale ( owner: owner, scale: resolvedScale, camera: camera)
572
+ }
573
+
574
+ private func transitionPinchImageScale( owner: CameraViewController , scale: CGFloat , camera: AVCaptureDevice ) {
575
+ let minAvailableZoomScale : CGFloat = 1.0
576
+ let maxAvailableZoomScale : CGFloat = 10.0
577
+ let availableZoomScaleRange = minAvailableZoomScale... maxAvailableZoomScale
578
+ let resolvedZoomScaleRange = zoomScaleRange. clamped ( to: availableZoomScaleRange)
579
+ let resolvedScale = max ( resolvedZoomScaleRange. lowerBound, min ( scale, resolvedZoomScaleRange. upperBound) )
580
+ setupImageScale ( owner: owner, scale: resolvedScale, camera: camera)
552
581
}
553
582
554
583
private func showPermissionAlertController( ) {
0 commit comments