@@ -17,6 +17,7 @@ protocol SelectSentencePresentableListener: AnyObject {
17
17
18
18
func showEditSentenceModal( with text: String )
19
19
func backButtonTapped( )
20
+ func nextButtonTapped( )
20
21
}
21
22
22
23
final class SelectSentenceViewController: UIViewController , SelectSentencePresentable , SelectSentenceViewControllable {
@@ -31,6 +32,9 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
31
32
static let height = 44
32
33
static let backButtonLeftMargin = 8
33
34
static let nextButtonRightMargin = 8
35
+ enum CollectionViewCell {
36
+ static let width = DeviceSize . width
37
+ static let height = DeviceSize . height - Metric. NavigationBar. height - InfoBox. height - 100
34
38
}
35
39
}
36
40
@@ -49,6 +53,14 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
49
53
return button
50
54
} ( )
51
55
56
+ private let nextButton : UIButton = {
57
+ let button = UIButton ( )
58
+ button. setTitle ( " 다음 " , for: . normal)
59
+ button. setTitleColor ( . systemGray, for: . disabled)
60
+ button. setTitleColor ( . particleColor. main, for: . normal)
61
+ return button
62
+ } ( )
63
+
52
64
private let navigationTitle : UILabel = {
53
65
let label = UILabel ( )
54
66
label. text = " 문장 선택 1/7 "
@@ -74,6 +86,21 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
74
86
let imageView = UIImageView ( )
75
87
imageView. contentMode = . scaleAspectFit
76
88
return imageView
89
+ private let selectedPhotoCollectionView : UICollectionView = {
90
+ let layout = UICollectionViewFlowLayout ( )
91
+ layout. itemSize = CGSize (
92
+ width: Metric . CollectionViewCell. width,
93
+ height: Metric . CollectionViewCell. height
94
+ )
95
+ layout. minimumLineSpacing = 0
96
+ layout. minimumInteritemSpacing = 0
97
+ layout. scrollDirection = . horizontal
98
+ let collectionView = UICollectionView ( frame: . zero, collectionViewLayout: layout)
99
+ collectionView. isPagingEnabled = true
100
+ collectionView. showsHorizontalScrollIndicator = false
101
+ collectionView. register ( SelectedPhotoCell . self)
102
+ collectionView. backgroundColor = . init( hex: 0x1f1f1f )
103
+ return collectionView
77
104
} ( )
78
105
79
106
private let textView : UITextView = {
@@ -122,6 +149,7 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
122
149
setConstraints ( )
123
150
setupNavigationBar ( )
124
151
configureTextView ( )
152
+ bind ( )
125
153
}
126
154
127
155
private func setupNavigationBar( ) {
@@ -131,23 +159,68 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
131
159
self ? . listener? . backButtonTapped ( )
132
160
}
133
161
. disposed ( by: disposeBag)
162
+
163
+ nextButton. rx. tap
164
+ . bind { [ weak self] in
165
+ self ? . listener? . nextButtonTapped ( )
166
+ }
167
+ . disposed ( by: disposeBag)
168
+
169
+ // TODO: 각 사진에서 문장추출이 모두 완료되었을 때 nextButton 활성화
170
+ // nextButton.isEnabled = false
134
171
}
135
172
136
173
private func configureTextView( ) {
137
174
textView. delegate = self
175
+ private func bind( ) {
176
+
177
+ bindCollectionViewCell ( )
178
+ bindPageIndex ( )
138
179
}
139
180
140
181
private func addCustomMenuItem( ) {
141
182
let menuItem1 = UIMenuItem ( title: " 문장뽑기 " , action: #selector( textSelected ( _: ) ) )
142
183
UIMenuController . shared. menuItems = nil
143
184
UIMenuController . shared. menuItems = [ menuItem1]
185
+ private func bindCollectionViewCell( ) {
186
+ Observable . of ( selectedImages)
187
+ . bind ( to: selectedPhotoCollectionView. rx. items (
188
+ cellIdentifier: SelectedPhotoCell . defaultReuseIdentifier,
189
+ cellType: SelectedPhotoCell . self)
190
+ ) { [ weak self] index, item, cell in
191
+ cell. setImage ( with: item)
192
+ cell. listener = self
193
+ }
194
+ . disposed ( by: disposeBag)
144
195
}
145
196
146
197
@objc private func textSelected( _ sender: UIMenuController ) {
147
198
if let selectedRange = textView. selectedTextRange {
148
199
let selectedText = textView. text ( in: selectedRange) ?? " 선택된 문장이 없습니다. "
149
200
listener? . showEditSentenceModal ( with: selectedText)
150
201
}
202
+ private func bindPageIndex( ) {
203
+ selectedPhotoCollectionView
204
+ . rx
205
+ . contentOffset
206
+ . subscribe { [ weak self] point in
207
+ guard let self = self , let positionX = point. element? . x else { return }
208
+ switch positionX {
209
+ case ( 0 ..< DeviceSize . width/ 2 ) :
210
+ self . navigationTitle. text = " 문장 선택 1/ \( self . selectedImages. count) "
211
+ case ( DeviceSize . width/ 2 ..< DeviceSize . width* ( 3 / 2 ) ) :
212
+ self . navigationTitle. text = " 문장 선택 2/ \( self . selectedImages. count) "
213
+ case ( DeviceSize . width* ( 3 / 2 ) ..< DeviceSize . width* ( 5 / 2 ) ) :
214
+ self . navigationTitle. text = " 문장 선택 3/ \( self . selectedImages. count) "
215
+ case ( DeviceSize . width* ( 5 / 2 ) ..< DeviceSize . width* ( 7 / 2 ) ) :
216
+ self . navigationTitle. text = " 문장 선택 4/ \( self . selectedImages. count) "
217
+ case ( DeviceSize . width* ( 7 / 2 ) ..< DeviceSize . width* ( 9 / 2 ) ) :
218
+ self . navigationTitle. text = " 문장 선택 5/ \( self . selectedImages. count) "
219
+ default :
220
+ return
221
+ }
222
+ }
223
+ . disposed ( by: disposeBag)
151
224
}
152
225
153
226
func recognizeTextImage( _ image: UIImage ? ) {
@@ -214,6 +287,7 @@ final class SelectSentenceViewController: UIViewController, SelectSentencePresen
214
287
215
288
// MARK: - UITextViewDelegate
216
289
extension SelectSentenceViewController : UITextViewDelegate {
290
+ extension SelectSentenceViewController : SelectedPhotoCellListener {
217
291
218
292
func textViewDidChangeSelection( _ textView: UITextView ) {
219
293
let selectedRange = textView. selectedRange
@@ -231,11 +305,11 @@ extension SelectSentenceViewController: UITextViewDelegate {
231
305
private extension SelectSentenceViewController {
232
306
233
307
func addSubviews( ) {
234
- [ backButton, navigationTitle] . forEach {
308
+ [ backButton, navigationTitle, nextButton ] . forEach {
235
309
navigationBar. addSubview ( $0)
236
310
}
237
311
238
- [ navigationBar, infoBox, textView ] . forEach {
312
+ [ navigationBar, infoBox, selectedPhotoCollectionView ] . forEach {
239
313
view. addSubview ( $0)
240
314
}
241
315
@@ -253,6 +327,11 @@ private extension SelectSentenceViewController {
253
327
$0. left. equalToSuperview ( ) . inset ( Metric . NavigationBar. backButtonLeftMargin)
254
328
}
255
329
330
+ nextButton. snp. makeConstraints {
331
+ $0. centerY. equalToSuperview ( )
332
+ $0. right. equalToSuperview ( ) . inset ( Metric . NavigationBar. nextButtonRightMargin)
333
+ }
334
+
256
335
navigationTitle. snp. makeConstraints {
257
336
$0. center. equalToSuperview ( )
258
337
}
@@ -269,6 +348,7 @@ private extension SelectSentenceViewController {
269
348
}
270
349
271
350
textView. snp. makeConstraints {
351
+ selectedPhotoCollectionView. snp. makeConstraints {
272
352
$0. top. equalTo ( infoBox. snp. bottom)
273
353
$0. leading. trailing. bottom. equalTo ( view. safeAreaLayoutGuide)
274
354
}
0 commit comments