์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- Xcode
- swift
- XCTest
- MVVM
- TCA
- SwiftUI
- ํ๋ก๊ทธ๋๋จธ์ค
- Kuring
- raywenderlich
- reactorkit
- ios
- UIKit
- Swfit
- CollectionView
- SnapKit
- designpattern
- realm
- tableView
- RxSwift
- ํจ์คํธ์บ ํผ์ค
- BOJ
- visionOS
- combine
- Lv2
- ๋ฐฑ์ค
- Flutter
- BFS
- node.js
- arkit
- rxcocoa
- Today
- Total
lgvv98
โจ๏ธ ch13 ํค๋ณด๋์ ๋ฐ๋ฅธ ๋ ์ด์์ ์กฐ์ ํ๊ธฐ ๋ณธ๋ฌธ
โจ๏ธ ch13 ํค๋ณด๋์ ๋ฐ๋ฅธ ๋ ์ด์์ ์กฐ์ ํ๊ธฐ
๐ฅ ์บ๋ฟ๋งจ 2021. 6. 26. 14:46โ ์ ์ด๋ฒ์๊ฐ์๋ ํค๋ณด๋์ ๋ฐ๋ฅธ ๋ ์ด์์์ ์กฐ์ ํด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ ๊ฒ์.
์ด๋ฒ ํฌ์คํ
๋ถํฐ๋,,,! ๋
นํ ๊ธฐ๋ฅ์ ๋ฐ๊ฒฌํด์ ๋
นํ๊ธฐ๋ฅ๋ ๋ฃ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
์์ง์ ์๋๊ฒ ๋ค,,, ^_^
์๋ฌดํผ ํค๋ณด๋์ ๋ฐ๋ฅธ ๋ ์ด์์ ์กฐ์ ์ด ์ด๋ค๊ฑด์ง ๊ทธ๋ฆผ์ผ๋ก ๋ณด์
์ง๊ธ ๋ณด๋ ์ด๋ฏธ์ง์ฒ๋ผ ํ ์คํธ ํ๋๊ฐ ํค๋ณด๋์ ๋ง๊ฒ ์กฐ์ ๋์ด์ผ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋๊ฒ ํธํ๊ฒ ์ง? ๋ง์ฝ์ ์ด๊ฒ ์กฐ์ ๋์ง ์๋๋ค๋ฉด ํค๋ณด๋์ ํ ์คํธ ํ๋๊ฐ ๊ฐ๋ ค์ง๋ ํ์์ด ๋ฐ์ํ ๊ฑฐ์ผ.
๊ทธ๋ผ ์ด๊ฑธ ์ด๋ป๊ฒ ์กฐ์ ํ๋๋?
-> bottom์ผ๋ก ๊ฑธ๋ฆฐ ๋ ์ด์์์ ์กฐ์ ํจ์ผ๋ก์จ ๋ณ๊ฒฝํ ์ ์์ด. ๊ทธ๋ผ ๋ค์์ ์ฝ๋๋ฅผ ํตํด ์ฌ์ฉํ๋ ๋ฒ์ ์์๋ณด๋๋ก ํ ๊น?
(๋ชฉ์ฐจ)
1. ํค๋ณด๋ ์ํ๋ฅผ ํ์ธํ ์ต์ ๋ฒ ์ค์
2. ์ ๋ ํฐ์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ์์๋ณด์
3. ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ๊ฒ ๋ง๋๋ ์ ์ค์ฒ ๋ฌ๊ธฐ
โ ํค๋ณด๋ ์ํ๋ฅผ ํ์ธํ ์ต์ ๋ฒ ์ค์
override func viewDidLoad() {
super.viewDidLoad()
// TODO: ํค๋ณด๋ ๋ํ
์
NotificationCenter.default.addObserver(self, selector: #selector(adjustInputView), name: UIResponder.keyboardWillShowNotification, object: nil)
// ํค๋ณด๋๊ฐ ๋์ค๋๊ฒ ๊ฐ์ง ๋๋ฉด์ ์๋์ ์คํธ ์ธํ๋ทฐ๊ฐ ์คํ๋ผ
NotificationCenter.default.addObserver(self, selector: #selector(adjustInputView), name: UIResponder.keyboardWillHideNotification, object: nil)
// ํค๋ณด๋๊ฐ ๋ค์ด๊ฐ๋๊ฒ ๊ฐ์ง ๋๋ฉด!! self๋ ์ด ๋ทฐ์ปจํธ๋กค๋ฌ์์ ๊ฐ์งํ๊ฒ ๋ค.
}
ํค๋ณด๋๋ฅผ ๊ฐ์งํ๊ธฐ ์ํด์๋ NotificationCenter์ ์ต์ ๋ฒ๋ฅผ ๋ถ์ฐฉํ์ฌ ์ด๋ค ์ํ์ธ์ง ํ์ธํ๋ฉด ๋ผ.
๊ทธ์ ๋ฐ๋ฅธ ์ก์ ์ ์ ๋ ํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ ๋ก์ง์ ๋ํ ๋ฉ์๋๋ฅผ ๊ฑด๋ค์ค ์ ์์ด.
โ ์ ๋ ํฐ์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ์์๋ณด์
@objc private func adjustInputView(noti: Notification) {
guard let userInfo = noti.userInfo else { return }
// TODO: ํค๋ณด๋ ๋์ด์ ๋ฐ๋ฅธ ์ธํ๋ทฐ ์์น ๋ณ๊ฒฝ
guard let keyboardFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
if noti.name == UIResponder.keyboardWillShowNotification {
let adjustmentHeight = keyboardFrame.height - view.safeAreaInsets.bottom
inputViewBottom.constant = adjustmentHeight
} else {
inputViewBottom.constant = 0
}
print("---> Keyboard End Frame: \(keyboardFrame)")
}
์ ๋ ํฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํ๋์ด ์์ด.
๋ ธํฐํผ์ผ์ด์ ์ ๋ํ ์ ๋ณด๋ ์๋์ ์ฐธ๊ณ ๋ถ๋ถ์ ๋ฐ๋ก ์ ์ด๋์์ผ๋, ๋ณด๊ธฐ๋กํ๊ณ , ์ฝ๋๋ฅผ ๋ณด๋ฉด userInfo๋ ์ต์ ๋ฒ๋ฅผ ํตํด ๋ฐ์์จ ์ ๋ณด๊ฐ ์๋์ง๋ฅผ ํ์ธํ๋ ์ฝ๋์ผ.
๋ค์์ผ๋ก๋ keyboardFrame์ ์์๋ณด์. ์ด ๋ถ๋ถ์ ๊ธฐ๊ธฐ๋ณ ํค๋ณด๋ ์ฌ์ด์ฆ๊ฐ ๋ชจ๋ ๋ค๋ฅด๊ฒ ์ง? ๊ทธ์ ๋์ํ๊ธฐ ์ํด์ ์์ฑ๋๋ ํจ์์ธ๋ฐ, ์ ํ ๊ณต์ ๊ฐ๋ฐ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด keyboardFrameEndUserInfoKey๋ ํค๋ณด๋๊ฐ ๋ํ๋๋ ์ ๋๋ฉ์ด์ ์ด ๋๋ ๋ ํ๋ ์์ ๊ฒ์ํ๋๊ฑฐ์ผ.
๋ค์์ if-else๋ฌธ์ธ๋ฐ notificationCenter์์ ์ด๋ค ์ด๋ฒคํธ๋ฅผ ๋ฐ์์๋์ง ๋ด์ผ๊ฒ ์ง?
if์๋ ํค๋ณด๋๊ฐ ๋ํ๋ ๋์ ์ก์ ์ธ๋ฐ, ํค๋ณด๋์ ๋์ด์์ ๋ทฐ์ ์๋์ชฝ safeArea๋ฅผ ๋นผ์ฃผ๋ ์ฝ๋๋ฅผ ํ์ธํ ์ ์์ด.
๊ทธ ์ด์ ๋ iPhone์ด ๋ ธ์น๊ฐ ์๋ ํ๋์จ์ด๊ฐ ์ถ์๋๋ฉด์, ๋ ธ์น์ ์ํด ๋ทฐ๊ฐ ์งค๋ ค ๋ณด์ผ ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ inset(๋ง์ง, ์ฌ๋ฐฑ)์ ๋๋๋ฐ, ์ด๊ฑธ ๋นผ์ค์ผ ํค๋ณด๋์ ์ ํํ๊ฒ ์ฐฉ ๋ฌ๋ผ๋ถ์ด!!
์์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ๊ฐ์ง?
๋ค์์ inputViewBottom์ธ๋ฐ, ์ด ๋ณ์๋ ๋ ์ด์์์ ๋ณ์๋ก ์ก์๊ฑฐ์ผ.
๋ ์ด์์์ ๋ค์๊ณผ ๊ฐ์ด ์ก๋๋ฐ, ์ฌ๊ธฐ์ second item์ ์ ํ์๋ View๋ ํ ์คํธํ๋์ ๋ฒํผ 2๊ฐ๋ฅผ ๋ด๊ณ ์๋ ๋ทฐ์ผ.
โ๏ธ์ํผ๋ทฐ๊ฐ ์๋๊ฒ์ ์ฃผ์
๊ทธ๋ผ ๋ค์ ์ฝ๋๋ก ๋์๊ฐ์ inputViewBottom.constant๋ฅผ ์ฐ๋ฆฌ๊ฐ ์ก์ ๊ฐ์ผ๋ก ๋ฐ๊ฟ์ฃผ๋ฉด? ์๋์ชฝ์ด ๋ถ ๋จ๊ฒ ๋๊ฒ ์ง? ํค๋ณด๋ ์์ ์์นํ๋ ํจ๊ณผ๋ฅผ ๋ณผ ์ ์์ด!!
๊ทธ๋ฆฌ๊ณ ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ๋ค๋ฉด, ์์ฐ์ค๋ฝ๊ฒ ์ด ๊ฐ์ 0์ผ๋ก ์ธํ ํด์ฃผ๋ฉด ๋ค์ ์๋ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๊ฑฐ์ผ!!
โ ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ๊ฒ ๋ง๋๋ ์ ์ค์ฒ ๋ฌ๊ธฐ
ํค๋ณด๋๋ฅผ ์ฌ๋ ธ์ผ๋๊น, ์ด์ ๋ด๋ ค์ผ๊ฒ ์ง? ๋ด๋ฆฌ๋ ๋ฐฉ๋ฒ์ ์ฐ๋ฆฌ๋ ๋ณดํต ํค๋ณด๋ ์ด์ธ์ ์ฌ๋ฐฑ์ ํด๋ฆญํ๋ฉด ํค๋ณด๋๊ฐ ๋ด๋ ค๊ฐ๊ธธ ๋ฐ๋ผ์์? ๊ทธ๋ ๊ฒ ๊ตฌํํด๋ณด๋๋ก ํ ๊ฒ.
ํญ ์ ์ค์ณ๋ฅผ ์ฐ์ ๋ฌ์์ผํ๋๋ฐ, ๊ฒ์ํด์ ๋ฌ๋ฉด ๋ผ.
UIView(์ํผ๋ทฐ) ์ชฝ์๋ค๊ฐ ๋ค๋๋ฐ, ๊ทธ๋์ผ์ง๋ง ๋ทฐ ํฐ์นํ์๋, ๋น ์ ธ๋์ฌ ์ ์๋ค.
โ๏ธ์ด๋ฒ์๋ ํ ์คํธ ํฌํจํ๋ ๋ทฐ ์๋๋๊น ์ฃผ์
์ ์ค์ณ๋ฅผ ์ฅ์ฐฉํ๊ฒ ๋๋ฉด ๋์ปค์ ์ธ๋ฒ์งธ์ ์ ์ค์ณ๊ฐ ์ฅ์ฐฉ๋ ๋ชจ์ต๋ ํ์ธํ ์ ์์ด.
์ฌ๊ธฐ์ ์กฐ๊ธ ์ฃผ๋ชฉํ ๋งํ ์ ์ ์ ์ค์ณ๋ IBAction์ผ๋ก ์ค์ ํ ์ ์๋ค๋ ์ ์ด์ผ ๊ทธ๋ผ ์ฝ๋๋ฅผ ํ๋ฒ ๋ณผ๊น?
// TODO: BG ํญํ์๋, ํค๋ณด๋ ๋ด๋ ค์ค๊ฒ ํ๊ธฐ
@IBAction func tapBG(_ sender: Any) {
inputTextField.resignFirstResponder()
}
์ ์ค์ณ๋ฅผ IBAction์ ํตํด ์ฐ๊ฒฐํ ์ฝ๋์ธ๋ฐ, ์ด ์ฝ๋์ ์๋ฏธ๋ ์ ํ ๊ฐ๋ฐ์ ๊ณต์ ๋ฌธ์์ ๋ฐ๋ฅด๋ฉด resignFirstResponder()์ ๊ฒฝ์ฐ "์ฒซ๋ฒ์งธ ์๋ต์๋ก์จ์ ์ํ๋ฅผ ํฌ๊ธฐํ๋ผ๋ ์์ฒญ์ ๋ฐ์๋ค" ๋ผ๋ ์๋ฏธ์ผ
์ฆ, ์ ์ค์ณ๊ฐ ๋ฑ๋ก๋ ๋ทฐ ํฐ์น์ ํค๋ณด๋๊ฐ ์ฌ๋ผ์ค๋ ํ ์คํธ ํ๋์ ์ํ๋ฅผ ํฌ๊ธฐํ๋ผ๋ ์๋ฏธ๋ก, ํฌ์ปค์ฑ์ ํ ์คํธ ํ๋์์ ๋บด๊ฒ ๋ผ
๊ทธ๋ผ ์ด๊ฒ์ผ๋ก ๋ง์น๋๋ก ํ์
- ์ฐธ๊ณ
[iOS] NotificationCenter ํบ์๋ณด๊ธฐ
iOS ํ๊ฒฝ์์ ๋ฐฑ๊ทธ๋ผ์ด ์์ ์ ๊ฒฐ๊ณผ, ๋น๋๊ธฐ ์์ ์ ๊ฒฐ๊ณผ ๋ฑ ํ์ฌ ์์ ์ ํ๋ฆ๊ณผ ๋ค๋ฅธ ํ๋ฆ์ ์์ ์ผ๋ก๋ถํฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ผ๋ ค๊ณ ํ ๋ Notification์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด, ๋์ฉ๋ ํ์ผ์ ๋ค
k-elon.tistory.com
https://developer.apple.com/documentation/uikit/uikeyboardframeenduserinfokey
Apple Developer Documentation
developer.apple.com
https://developer.apple.com/documentation/uikit/uiresponder/1621097-resignfirstresponder
Apple Developer Documentation
developer.apple.com
'โ ๏ธ deprecated โ ๏ธ > ํจ์บ (์ฌ์ธ์)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ก ch14 Networking (0) | 2021.06.28 |
---|---|
ch13 Todo ๋ฆฌ์คํธ ์ฝ๋๋ฆฌ๋ทฐ (0) | 2021.06.26 |
๐คช ch13 ๋ฒํผ ์ํ์ ๋ฐ๋ผ ๋ฐ๊ฟ์ฃผ๊ธฐ (0) | 2021.06.26 |
๐ ch13 swift Equatable?! (0) | 2021.06.25 |
๐ฆง ch13 Static Cell (TableView) (0) | 2021.06.25 |