@@ -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 {
@@ -276,6 +276,41 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
276
276
NotificationCenter . default. post ( name: . DidFinishProfileImageUpdate, object: nil , userInfo: userInfo)
277
277
} . disposed ( by: disposeBag)
278
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)
279
314
280
315
reactor. state
281
316
. map { ( $0. accountImage, $0. profileImageURLEntity, $0. memberId) }
@@ -322,12 +357,10 @@ public final class CameraViewController: BaseViewController<CameraViewReactor> {
322
357
323
358
cameraView. rx
324
359
. pinchGesture
325
- . withUnretained ( self )
326
- . observe ( on: MainScheduler . instance)
327
- . bind ( onNext: {
328
- guard let currentCamera = $0. 0 . isToggle ? $0. 0 . frontCamera : $0. 0 . backCamera else { return }
329
- $0. 0 . transitionImageScale ( owner: $0. 0 , gesture: $0. 1 , camera: currentCamera)
330
- } ) . disposed ( by: disposeBag)
360
+ . map { $0. scale }
361
+ . map { Reactor . Action. dragPreviewLayer ( $0) }
362
+ . bind ( to: reactor. action)
363
+ . disposed ( by: disposeBag)
331
364
332
365
333
366
toggleButton
@@ -529,25 +562,22 @@ extension CameraViewController: AVCapturePhotoCaptureDelegate {
529
562
self . navigationController? . popViewController ( animated: true )
530
563
}
531
564
532
- private func transitionImageScale( owner: CameraViewController , gesture: UIPinchGestureRecognizer , camera: AVCaptureDevice ) {
533
-
534
- switch gesture. state {
535
-
536
- case . began:
537
- owner. initialScale = camera. videoZoomFactor
538
-
539
- case . changed:
540
- let minAvailableZoomScale = camera. minAvailableVideoZoomFactor
541
- let maxAvailableZoomScale = camera. maxAvailableVideoZoomFactor
542
- let availableZoomScaleRange = minAvailableZoomScale... maxAvailableZoomScale
543
- let resolvedZoomScaleRange = zoomScaleRange. clamped ( to: availableZoomScaleRange)
544
-
545
- let resolvedScale = max ( resolvedZoomScaleRange. lowerBound, min ( gesture. scale * initialScale, resolvedZoomScaleRange. upperBound) )
546
- setupImageScale ( owner: owner, scale: resolvedScale, camera: camera)
547
- default :
548
- return
549
-
550
- }
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)
551
581
}
552
582
553
583
private func showPermissionAlertController( ) {
0 commit comments