@@ -45,7 +45,7 @@ class CourseUploadVC: UIViewController {
4545 }
4646 private let distanceInfoView = CourseDetailInfoView ( title: " 거리 " , description: " 0.0km " )
4747 private let departureInfoView = CourseDetailInfoView ( title: " 출발지 " , description: " " )
48- private let placeholder = " 코스에 대한 소개를 적어주세요.(난이도/풍경/지형) "
48+ private let placeholder = " 코스에 대한 소개를 적어주세요.(난이도/풍경/지형) \n (최대 150자) "
4949
5050 let activityTextView = UITextView ( ) . then {
5151 $0. font = . b4
@@ -61,11 +61,10 @@ class CourseUploadVC: UIViewController {
6161 setNavigationBar ( )
6262 setUI ( )
6363 setLayout ( )
64- setupTextView ( )
64+ setDelegate ( )
6565 setAddTarget ( )
66- setKeyboardNotification ( )
6766 setTapGesture ( )
68- addKeyboardObserver ( )
67+ setKeyboardObservers ( )
6968 analyze ( screenName: GAEvent . View. viewCourseUpload)
7069 }
7170
@@ -107,29 +106,21 @@ extension CourseUploadVC {
107106 self . uploadButton. addTarget ( self , action: #selector( uploadButtonDidTap) , for: . touchUpInside)
108107 }
109108
110- // 키보드가 올라오면 scrollView 위치 조정
111- private func setKeyboardNotification( ) {
112- NotificationCenter . default. addObserver (
113- self ,
114- selector: #selector( keyboardWillShow) ,
115- name: UIResponder . keyboardWillShowNotification,
116- object: nil )
117-
118- NotificationCenter . default. addObserver (
119- self ,
120- selector: #selector( keyboardWillHide) ,
121- name: UIResponder . keyboardWillHideNotification,
122- object: nil )
123- }
124-
125109 // 화면 터치 시 키보드 내리기
126110 private func setTapGesture( ) {
127111 let tap = UITapGestureRecognizer ( target: view, action: #selector( UIView . endEditing) )
128112 tap. cancelsTouchesInView = false
129113 view. addGestureRecognizer ( tap)
130114 }
131115
132- private func addKeyboardObserver( ) {
116+ // 업로드 버튼 상태 업데이트 메소드
117+ private func updateUploadButtonState( ) {
118+ let isTitleNotEmpty = !( courseTitleTextField. text? . trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty ?? true )
119+ let isContentNotEmptyAndNotPlaceholder = !( activityTextView. text. trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty || activityTextView. text == placeholder)
120+ uploadButton. setEnabled ( isTitleNotEmpty && isContentNotEmptyAndNotPlaceholder)
121+ }
122+
123+ private func setKeyboardObservers( ) {
133124 NotificationCenter . default. addObserver (
134125 self ,
135126 selector: #selector( keyboardWillShow) ,
@@ -146,19 +137,7 @@ extension CourseUploadVC {
146137
147138extension CourseUploadVC {
148139 @objc private func textFieldTextDidChange( ) {
149- guard let text = courseTitleTextField. text else { return }
150-
151- if text. count > courseTitleMaxLength {
152- let index = text. index ( text. startIndex, offsetBy: courseTitleMaxLength)
153- let newString = text [ text. startIndex..< index]
154- self . courseTitleTextField. text = String ( newString)
155- }
156-
157- if text. count == 0 && activityTextView. text != self . placeholder && activityTextView. text. count == 0 {
158- uploadButton. setEnabled ( true )
159- } else {
160- uploadButton. setEnabled ( false )
161- }
140+ updateUploadButtonState ( )
162141 }
163142
164143 @objc private func keyboardWillShow( _ notification: Notification ) {
@@ -175,11 +154,12 @@ extension CourseUploadVC {
175154 scrollView. contentInset = contentInset
176155 scrollView. scrollIndicatorInsets = contentInset
177156
178- if activityTextView. isFirstResponder {
157+ // scrollView 높이 설정
158+ if courseTitleTextField. isFirstResponder || activityTextView. isFirstResponder {
179159 let contentViewHeight = scrollView. contentSize. height
180160 let textViewHeight = activityTextView. frame. height
181161 let textViewOffsetY = contentViewHeight - ( contentInset. bottom + textViewHeight)
182- let position = CGPoint ( x: 0 , y: textViewOffsetY + 100 )
162+ let position = CGPoint ( x: 0 , y: textViewOffsetY + 50 )
183163 scrollView. setContentOffset ( position, animated: true )
184164 return
185165 }
@@ -198,28 +178,29 @@ extension CourseUploadVC {
198178 }
199179}
200180
201- // MARK: - naviVar Layout
202-
203181extension CourseUploadVC {
182+
183+ // MARK: - naviVar Layout
184+
204185 private func setNavigationBar( ) {
205186 view. addSubview ( navibar)
206187 navibar. snp. makeConstraints {
207188 $0. top. leading. trailing. equalTo ( view. safeAreaLayoutGuide)
208189 $0. height. equalTo ( 48 )
209190 }
210191 }
211- // MARK: - setUI
192+ // MARK: - UI & Layout
212193
213194 private func setUI( ) {
214195 view. backgroundColor = . w1
215196 scrollView. backgroundColor = . clear
216197 buttonContainerView. backgroundColor = . w1
217198 mapImageView. backgroundColor = . systemGray4
218199
200+ activityTextView. text = placeholder
201+ activityTextView. textColor = . g3
219202 }
220203
221- // MARK: - Layout Helpers
222-
223204 private func setLayout( ) {
224205 view. addSubview ( buttonContainerView)
225206 view. bringSubviewToFront ( uploadButton)
@@ -241,14 +222,15 @@ extension CourseUploadVC {
241222
242223 private func setScrollViewLayout( ) {
243224 view. addSubview ( scrollView)
244- [ mapImageView,
245- courseTitleTextField,
246- dividerView,
247- distanceInfoView,
248- departureInfoView,
249- activityTextView] . forEach {
250- scrollView. addSubview ( $0)
251- }
225+
226+ scrollView. addSubviews (
227+ mapImageView,
228+ courseTitleTextField,
229+ dividerView,
230+ distanceInfoView,
231+ departureInfoView,
232+ activityTextView
233+ )
252234
253235 scrollView. snp. makeConstraints {
254236 $0. top. equalTo ( navibar. snp. bottom)
@@ -294,13 +276,14 @@ extension CourseUploadVC {
294276 }
295277 }
296278
297- func setupTextView ( ) {
279+ func setDelegate ( ) {
298280 activityTextView. delegate = self
299- activityTextView. text = placeholder
300- activityTextView. textColor = . g3
281+ courseTitleTextField. delegate = self
301282 }
302283}
303284
285+ // MARK: - UITextViewDelegate
286+
304287extension CourseUploadVC : UITextViewDelegate {
305288 func textViewDidBeginEditing( _ textView: UITextView ) {
306289 if textView. text. trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty {
@@ -314,16 +297,13 @@ extension CourseUploadVC: UITextViewDelegate {
314297 }
315298
316299 func textViewDidChange( _ textView: UITextView ) {
317- if !courseTitleTextField. isEmpty && !activityTextView. text. isEmpty {
318- uploadButton. setEnabled ( true )
319- } else {
320- uploadButton. setEnabled ( false )
321- }
300+ updateUploadButtonState ( )
322301
323302 if activityTextView. text. count > 150 {
324303 activityTextView. deleteBackward ( )
325304 }
326305 }
306+
327307 func textViewDidEndEditing( _ textView: UITextView ) {
328308 if textView. text. trimmingCharacters ( in: . whitespacesAndNewlines) . isEmpty || textView. text == placeholder {
329309 activityTextView. textColor = . g3
@@ -332,6 +312,18 @@ extension CourseUploadVC: UITextViewDelegate {
332312 }
333313}
334314
315+ // MARK: - UITextFieldDelegate
316+
317+ extension CourseUploadVC : UITextFieldDelegate {
318+ func textFieldShouldReturn( _ textField: UITextField ) -> Bool {
319+ if textField == courseTitleTextField {
320+ activityTextView. becomeFirstResponder ( )
321+ return true
322+ }
323+ return false
324+ }
325+ }
326+
335327// MARK: - Network
336328
337329extension CourseUploadVC {
0 commit comments