Skip to content

Commit 11bf15d

Browse files
authored
Merge pull request #26 from boostcampwm-2024/feat/#20-create-edit-photo-scrollview
[FEAT/#20] 편집 화면에서 사용될 공통 ScrollView를 구현함
2 parents 0b529cb + db6d1fa commit 11bf15d

File tree

10 files changed

+130
-19
lines changed

10 files changed

+130
-19
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"info" : {
3+
"author" : "xcode",
4+
"version" : 1
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "sampleImage.png",
5+
"idiom" : "universal",
6+
"scale" : "1x"
7+
},
8+
{
9+
"filename" : "sampleImage@2x.png",
10+
"idiom" : "universal",
11+
"scale" : "2x"
12+
},
13+
{
14+
"filename" : "sampleImage@3x.png",
15+
"idiom" : "universal",
16+
"scale" : "3x"
17+
}
18+
],
19+
"info" : {
20+
"author" : "xcode",
21+
"version" : 1
22+
}
23+
}
265 KB
Loading
596 KB
Loading
685 KB
Loading

PhotoGether/PresentationLayer/DesignSystem/DesignSystem/Source/PTGImage.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@ public enum PTGImage {
55
case stickerIcon
66
case chevronLeftWhite
77
case chevronRightBlack
8+
case sampleImage
89
case temp1, temp2, temp3, temp4
910

10-
1111
public var image: UIImage {
1212
switch self {
1313
case .frameIcon:
@@ -18,6 +18,8 @@ public enum PTGImage {
1818
return UIImage(resource: .chevronLeftWhite)
1919
case .chevronRightBlack:
2020
return UIImage(resource: .chevronRightBlack)
21+
case .sampleImage:
22+
return UIImage(resource: .sample)
2123
case .temp1:
2224
return UIImage(resource: .temp1)
2325
case .temp2:

PhotoGether/PresentationLayer/EditPhotoRoomFeature/EditPhotoRoomFeature.xcodeproj/project.pbxproj

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
053DC8512CE32A8800DC9F35 /* EditPhotoHostBottomView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 053DC8502CE32A8800DC9F35 /* EditPhotoHostBottomView.swift */; };
1111
053DC8532CE32AE900DC9F35 /* DesignSystem.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 053DC8522CE32AE900DC9F35 /* DesignSystem.framework */; };
1212
053DC8542CE32AE900DC9F35 /* DesignSystem.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 053DC8522CE32AE900DC9F35 /* DesignSystem.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
13+
05C297562CE391FF00108687 /* CanvasScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 05C297552CE391FF00108687 /* CanvasScrollView.swift */; };
1314
60B03BDF2CE3810200A7C748 /* FrameImageGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60B03BDE2CE3810200A7C748 /* FrameImageGenerator.swift */; };
1415
60B03BE22CE43FAF00A7C748 /* FrameImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60B03BE12CE43FAF00A7C748 /* FrameImageView.swift */; };
1516
60B03BE42CE43FE200A7C748 /* DefaultFrameImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 60B03BE32CE43FE200A7C748 /* DefaultFrameImageView.swift */; };
@@ -73,6 +74,8 @@
7374
/* Begin PBXFileReference section */
7475
053DC8502CE32A8800DC9F35 /* EditPhotoHostBottomView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditPhotoHostBottomView.swift; sourceTree = "<group>"; };
7576
053DC8522CE32AE900DC9F35 /* DesignSystem.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = DesignSystem.framework; sourceTree = BUILT_PRODUCTS_DIR; };
77+
78+
05C297552CE391FF00108687 /* CanvasScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CanvasScrollView.swift; sourceTree = "<group>"; };
7679
60B03BDE2CE3810200A7C748 /* FrameImageGenerator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameImageGenerator.swift; sourceTree = "<group>"; };
7780
60B03BE12CE43FAF00A7C748 /* FrameImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FrameImageView.swift; sourceTree = "<group>"; };
7881
60B03BE32CE43FE200A7C748 /* DefaultFrameImageView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DefaultFrameImageView.swift; sourceTree = "<group>"; };
@@ -213,8 +216,9 @@
213216
60CB82A52CDB514F00873DD6 /* Source */ = {
214217
isa = PBXGroup;
215218
children = (
216-
60CB82A42CDB514F00873DD6 /* EditPhotoRoomHostViewController.swift */,
219+
05C297552CE391FF00108687 /* CanvasScrollView.swift */,
217220
053DC8502CE32A8800DC9F35 /* EditPhotoHostBottomView.swift */,
221+
60CB82A42CDB514F00873DD6 /* EditPhotoRoomHostViewController.swift */,
218222
60B03BE02CE43F8200A7C748 /* FrameImageGenerator */,
219223
);
220224
path = Source;
@@ -349,6 +353,7 @@
349353
isa = PBXSourcesBuildPhase;
350354
buildActionMask = 2147483647;
351355
files = (
356+
05C297562CE391FF00108687 /* CanvasScrollView.swift in Sources */,
352357
60B03BED2CE47D8400A7C748 /* FrameView.swift in Sources */,
353358
60B03BE22CE43FAF00A7C748 /* FrameImageView.swift in Sources */,
354359
053DC8512CE32A8800DC9F35 /* EditPhotoHostBottomView.swift in Sources */,
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import UIKit
2+
import DesignSystem
3+
4+
final class CanvasScrollView: UIScrollView {
5+
private let image = PTGImage.sampleImage.image
6+
let imageView = UIImageView()
7+
8+
9+
override init(frame: CGRect) {
10+
super.init(frame: frame)
11+
12+
delegate = self
13+
addViews()
14+
setupConstraints()
15+
configureUI()
16+
}
17+
18+
required init?(coder: NSCoder) {
19+
fatalError("init(coder:) has not been implemented")
20+
}
21+
22+
private func addViews() {
23+
[imageView].forEach {
24+
addSubview($0)
25+
}
26+
}
27+
28+
private func setupConstraints() {
29+
imageView.snp.makeConstraints {
30+
$0.width.equalTo(image.size.width)
31+
$0.height.equalTo(image.size.height)
32+
}
33+
}
34+
35+
private func configureUI() {
36+
isScrollEnabled = true
37+
maximumZoomScale = 3
38+
bouncesZoom = true
39+
showsHorizontalScrollIndicator = false
40+
showsVerticalScrollIndicator = false
41+
42+
imageView.image = image
43+
imageView.contentMode = .scaleAspectFit
44+
}
45+
46+
func contentCentering() {
47+
let scrollView = self
48+
let contentView = imageView
49+
50+
let scrollViewSize = scrollView.bounds.size
51+
let contentSize = contentView.frame.size
52+
53+
let horizontalInset = max((scrollViewSize.width - contentSize.width) / 2, 0)
54+
let verticalInset = max((scrollViewSize.height - contentSize.height) / 2, 0)
55+
56+
contentInset = UIEdgeInsets(
57+
top: verticalInset,
58+
left: horizontalInset,
59+
bottom: verticalInset,
60+
right: horizontalInset
61+
)
62+
}
63+
64+
func setupZoomScale() {
65+
let widthBaseScale = frame.width / image.size.width
66+
let heightBaseScale = frame.height / image.size.height
67+
let calculatedZoomScale = min(widthBaseScale, heightBaseScale)
68+
69+
zoomScale = calculatedZoomScale
70+
minimumZoomScale = calculatedZoomScale
71+
}
72+
}
73+
74+
extension CanvasScrollView: UIScrollViewDelegate {
75+
public func viewForZooming(in scrollView: UIScrollView) -> UIView? {
76+
return imageView
77+
}
78+
}

PhotoGether/PresentationLayer/EditPhotoRoomFeature/EditPhotoRoomFeature/Source/EditPhotoHostBottomView.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import UIKit
22
import DesignSystem
33

44
final class EditPhotoHostBottomView: UIView {
5+
// TODO: 추후 internal or tapPublisher만 참조할 수 있도록
56
private let stackView = UIStackView()
67
private let frameButton = PTGGrayButton(type: .frame)
78
private let nextButton = UIButton()

PhotoGether/PresentationLayer/EditPhotoRoomFeature/EditPhotoRoomFeature/Source/EditPhotoRoomHostViewController.swift

Lines changed: 13 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
import UIKit
22
import BaseFeature
33

4-
public class EditPhotoRoomHostViewController: BaseViewController {
4+
public class EditPhotoRoomHostViewController: BaseViewController, UIScrollViewDelegate {
55
private let bottomView = EditPhotoHostBottomView()
66
private let navigationView = UIView()
7-
private let canvasView = UIScrollView()
8-
private let contentView = UIView()
7+
private let canvasScrollView = CanvasScrollView()
98

109
public init() {
1110
super.init(nibName: nil, bundle: nil)
@@ -20,16 +19,21 @@ public class EditPhotoRoomHostViewController: BaseViewController {
2019

2120
addViews()
2221
setupConstraints()
23-
// configureUI()
22+
configureUI()
2423
temp()
2524
}
2625

26+
public override func viewDidLayoutSubviews() {
27+
super.viewDidLayoutSubviews()
28+
29+
canvasScrollView.setupZoomScale()
30+
canvasScrollView.contentCentering()
31+
}
32+
2733
public override func addViews() {
28-
[navigationView, canvasView, bottomView].forEach {
34+
[navigationView, canvasScrollView, bottomView].forEach {
2935
view.addSubview($0)
3036
}
31-
32-
canvasView.addSubview(contentView)
3337
}
3438

3539
public override func setupConstraints() {
@@ -39,18 +43,12 @@ public class EditPhotoRoomHostViewController: BaseViewController {
3943
$0.height.equalTo(48)
4044
}
4145

42-
canvasView.snp.makeConstraints {
46+
canvasScrollView.snp.makeConstraints {
4347
$0.top.equalTo(navigationView.snp.bottom)
4448
$0.horizontalEdges.equalToSuperview()
4549
$0.bottom.equalTo(bottomView.snp.top)
4650
}
4751

48-
contentView.snp.makeConstraints {
49-
$0.width.equalTo(1000)
50-
$0.height.equalTo(1000)
51-
$0.center.equalToSuperview()
52-
}
53-
5452
bottomView.snp.makeConstraints {
5553
$0.bottom.equalTo(view.safeAreaLayoutGuide)
5654
$0.horizontalEdges.equalToSuperview()
@@ -68,8 +66,6 @@ public class EditPhotoRoomHostViewController: BaseViewController {
6866

6967
navigationView.backgroundColor = .yellow
7068
bottomView.backgroundColor = .yellow
71-
72-
canvasView.backgroundColor = .red
73-
contentView.backgroundColor = .blue
69+
canvasScrollView.backgroundColor = .red
7470
}
7571
}

0 commit comments

Comments
 (0)