์ค๋์ keyboard์ ๊ดํ ์์์ ์ดํด๋ณด์์ต๋๋ค. ์ฌ์ค ์ฒ์ ์์ ์ ๋ชฉ์ ๋ณด์์๋ ํค๋ณด๋ ?? ํ ๋ญ๊ฐ ๋๋ฆฐ๋ค .. ์ถ์์ต๋๋ค ใ ใ
์ฐฝ์ ํ์์ ํค๋ณด๋ ์ฌ๋ฆฌ๊ณ , ๋ด๋ฆฌ๊ณ ํ ๋ ๋ ์ด์์ ๋ณ๊ฒฝ ์ฝ๋๊ฐ ์ด๋ ๊ฒ ํ๋๊ฑฐ ๋ง๋ ..? ์ผ๋งค ๊ฐ์๋ฐ ํ๋ ์ฐ์ฐํจ์ด ์์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ iOS 15์์ ์ด๋ค ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ง ์์๋ณด๊ณ ์ ์์์ ๋ณด๊ณ ์ ๋ฆฌํ๊ฒ ๋์์ต๋๋ค !!
https://developer.apple.com/videos/play/wwdc2021/10259/
Layout guide
์์ ๋ถํฐ์ ๋ฐฉ์
1. Notification ๋ฑ๋ก
2. notification์ผ๋ก๋ถํฐ offset, animation ๊ฐ์ ธ์
3. ๊ณ์ฐ(math)
4. layout ์กฐ์
์ด ๋ฐฉ์์ deprecatedํ์ง ์์์ง๋ง, ์ฝ๋๊ฐ ๋ฌด์ง๋ง์งํ๊ฒ ๊ธด ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
Notification์ ๋ฑ๋กํ๊ณ View์ constraint๋ฅผ ์ ๋ฐ์ดํธ ํด์ฃผ๊ธฐ ์ํด notification์ผ๋ก๋ถํฐ ๋ฐ์ info๋ฅผ ์ฌ์ฉํด layout ํด์ค๋๋ค.
@objc func keyboardWillShow(notification: NSNotification) {
if let keyboardFrame: NSValue = notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue {
let keyboardReactangle = keyboardFrame.cgRectValue
let keyboardHeight = keyboardReactangle.height
buttonBottomConstraint.constant = keyboardHeight - self.view.safeAreaInsets.bottom
self.view.layoutIfNeeded()
}
}
@objc func keyboardWillHide(notification: NSNotification) {
buttonBottomConstraint.constant = 0//safe area
self.view.layoutIfNeeded()
}
์ด์ ์๋ก์ด ๋ฐฉ์์ ์๊ฐํฉ๋๋ค. ๋ฐ๋ก UIKeyboardLayoutGuided์ธ๋ฐ์ !
์ฐ์ view์ keyboardlayoutGuide๋ฅผ ๋ถ์ฌ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋์ด์ notificationCenterr๊ฐ ํ์ ์์ผ๋ฏ๋ก, boiler code๋ฅผ ๋ค ์ง์์ฃผ๋ฉด ?
๋ฐ ?? ๋๋ฐ ...
๋์ด๋ค์ ..?
์ ์ฝ๋๋ก username textfield ํฐ์น์ ์๋์ ๊ฐ์ด login Button์ ์๋ก ์ฌ๋ฆด ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด ๋งค์ง ๊ฐ์ keyboardLayoutGuide์ ๋ํด ๋ ์ดํด๋ณผ๊น์ ??
์ฐ์ UIView์ property
๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ์ ์ธ ๊ฒฝ์ฐ keyboard.topAnchor์ layout ๋๋๋ก ํจ
๊ทธ์ ๋ฐ๋ผ animation ํ๊ณ
keyboard์ ๋์ด๊ฐ ์ด๋ชจํฐ์ฝ, ์ํ๋ฒณ ๋ฑ์ ๋ํด ๋ค๋ฅธ๋ฐ ์ด๋ฅผ ์๋์ผ๋ก ๊ณ์ฐ
๋ํ keyboard๊ฐ unlock์ guide๋ safe area์ bottom์ ๋ง์ถฐ ์
๋ฐ์ดํธ
์ normal layout guide๊ฐ ์๋ ์ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ์๊น์ ?
ํค๋ณด๋๋ก ๋ ๋ง์ ๊ฒ์ ํ ์ ์๊ฒ ๋ง๋ค๊ธฐ ์ํด์ ,,?
์๋ํ๋ฉด ์ฐ๋ฆฌ์ ๋ค์ step์ ์ฑ์ full keyboard integration ํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ํ๋ค์.
์ integration ์ผ๊น ?
๋๋ ์์ฃผ keyboard๊ฐ ์ฑ์ ํ๋ฒํ ์ผ๋ถ์์๋ ํผํ๊ณ ์ถ๊ณ , ์ธ์ฐ๊ณ ์ถ๋ค๋ ์๊ธฐ๋ฅผ ๋ง์ด ๋ค์์. ์ฐ๋ฆฌ๊ฐ UIKeyboard layout guide๋ฅผ ์๋กญ๊ฒ ๊ณ ์ํ ์ด์ ๋ ๋ฐ๋ก ์ด๊ฒ์ ํด๊ฒฐํ๊ธฐ ์ํด์์. ๋ง์ ๋๋ฒจ๋กํผ๊ฐ input text์ ๋ค์ํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ๊ฒ๋ ์ ๋ํ๊ณ ์ถ์. ๊ทธ๋ฆฌ๊ณ ํค๋ณด๋๋ ์ง๊ธ๊น์ง ์์๋ ๋ ์ด์์์ ์ผ๋ถ๋ผ๊ณ ์๊ฐํ๊ฒ๋ ํ๊ณ ์ถ์ !!
์ ์ด์ผ๊ธฐ๊ฐ ์ฐธ ๊ฐ์ด์ ์๋ฟ๋๊ฒ ๊ฐ์ต๋๋ค. ์ ๊ฐ ๋ฒ์ญํด์ ์์ด์ฒด์ด์ง๋ง ใ ํค๋ณด๋๋ ์ฑ๋ด ๋ถ์์ ์ธ ์์๋ก ์น์ฐ์ณ ๋ง์ ๊ณ ๋ฏผ์ ํด๋ณด์ง ์์๋๊ฒ ๊ฐ์ต๋๋ค. ์์ดํจ๋์ split, floating ํค๋ณด๋๊ฐ ์๋ค๋ ์ฌ์ค๋ ์ฒ์ ์์๊ตฌ์ !, ํค๋ณด๋ ์์ inputAccessoryView๋ ๋ฐ์ผ๋ก ๋ด๋ ค๊ฐ ์ ์๊ฒ ํ๋ค๋ ๊ฒ๋ ์ฒ์ ์์์ต๋๋ค.
Integrating the keyboard
.followUndockedKeyboard
keyboard layout guide๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ property์ ์ฌ์ฉํ์ฌ ํค๋ณด๋์ ๋ชจ๋ ๊ธฐ๋ฅ์ ์๋ฒฝํ๊ฒ ๋ฐ๋ผ๊ฐ ์ ์์
๊ธฐ๋ณธ ๊ฐ์ false๊ณ true๋ก ํ๋ค๋ฉด undocked ๋์ด ์๊ฑฐ๋ floating ๋์ด ์์๋ guide๊ฐ ํค๋ณด๋๋ฅผ ๋ฐ๋ผ layout์ ๊ดํด ๋ง์ ํต์ ๋ฅผ ์ค ์ ์์ต๋๋ค.
UI keyboard layout guide๋ ๋ ๋ค๋ฅธ layoutGuide(UI tracking layout guide)์ sub class์
๋๋ค.
ํ๋ฉด์์ ๋ณ๊ฒฝํ constraints๋ฅผ ์ถ์ ํ๊ธฐ ๋๋ฌธ์ tracking layout guide๋ผ๊ณ ํฉ๋๋ค.
ํน์ ๊ฐ์ฅ์๋ฆฌ ๊ทผ์ฒ์ ์์๋ ํ์ฑํํ๊ณ ๋ ๋ ๋ ๋นํ์ฑํํ๋ constraints์ ๋ฐฐ์ด์ ์ง์ ํ ์ ์์ต๋๋ค.
๋๋ ๊ฐ์ฅ์๋ฆฌ์์ ๋จ์ด์ ธ ์์๋(awayFrom) ํ์ฑํํ๊ณ ๊ทผ์ฒ์ ์์๋ ๋นํ์ฑํํ๋ ๋ฐฐ์ด์ ์ง์ ํ ์ ์์ต๋๋ค.
์์ ํ๋ฉด๊ณผ ์ฝ๋๋ฅผ ๋ด
์๋ค
๊ทธ๋ฆฌ๊ณ ํค๋ณด๋๋ฅผ ํ๋ฉด ๊ฐ๋ฆฌ์ง ์๊ธฐ ์ํด์ ์ด๋ฆฌ ์ ๋ฆฌ ์์ง์ด๋ฉด
ํ๋ฉด์ด ์น์ ํ ๋น์ผ์ค๋ค .. ์ฐ์
์ด๋ป๊ฒ ๊ตฌํํ๋์ง ์ฝ๋๋ฅผ ์ดํด๋ณด์
์ฐ์ editView(์ ์ฒด view)์ bottonAnchor์ keyboard view์ topanchor๋ฅผ ๋ฌถ์ ๋ฐฐ์ด์ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ keyboard layoutguide๊ฐ top์์ ๋ฉ์ด์ง๋๋ง ์ ์ฝ ์กฐ๊ฑด์ ์ฃผ์๊ณ , top ๊ทผ์ฒ์ผ ๊ฒฝ์ฐ ๋นํ์ฑํ ๋ ๊ฒ์
๋๋ค.
๊ทธ๋ฆฌ๊ณ keyboard๊ฐ top์ ๊ฐ๊น์์ง ๊ฒฝ์ฐ๋ฅผ ์ํ ๋ถ๋ฆฌ๋ constraint ๋ฐฐ์ด์ ๋ง๋ค์์ต๋๋ค.
์ด๋ Keyboard layout guide์ top ๋์ ์ safe area bottom์ ์ฌ์ฉํ ๊ฒ
์์๋ฅผ ๋ด ๋ด
์๋ค.
ํ์ฌ keyboard๋ editView์ top์ผ๋ก๋ถํฐ ๋ฉ๋ฆฌ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก awayFromTopConstraints๊ฐ ํ์ฑํ ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง layoutGuide๋ฅผ top ๊ทผ์ฒ๋ก ์ฎ๊ธธ ๊ฒฝ์ฐ, awayFromTopConstraints๊ฐ ๋นํ์ฑํ๋๊ณ
๊ทผ๋ฐ ์ ํ๋์์ ๋ชจ์ง ..
ํ๋์ view๋ฅผ view์ bottom์ผ๋ก ๋ฎ์ถฐ nearTopConstraints๊ฐ ํ์ฑํ ๋ ๊ฒ์ ๋๋ค.
๋ค์์ ์ํ ์ด๋์ ์ดํด๋ด
์๋ค.
keyboard๊ฐ leading or trailing์ผ๋ก๋ถํฐ ๋ฉ์ด์ง๋ฉด, editView๋ฅผ center์ ๋๊ฒ์
๋๋ค. ๋ํ imageView๋ view์ center์ ๋๊ณ ์ถ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ์๋ฆฌ์ชฝ์ผ๋ก ๊ฐ ๊ฒฝ์ฐ๋ ๋ด๋ด ์๋ค.
nearTrailingConstraints๋ keyboard๊ฐ trailing์ผ๋ก ๊ฐ๋ imageView๋ฅผ leading์ผ๋ก constraintํ๋ฉฐ nearLeadingConstraints๋ ๊ทธ ๋ฐ๋์ ๋๋ค.
ํค๋ณด๋๋ฅผ ์๋ก ์์ง์ด๋ฉด ?
bottom์ผ๋ก ๋จ์ด์ง๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์์ผ๋ก ์์ง์ด๋ฉด ? ํผํ๋ ๊ผด์ด ๋ฉ๋๋ค ใ ใ
๊ทธ๋ฌ๋ฉด near๊ณผ awayFrom์ด ์ ํํ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๊ฐํด๋ด
์๋ค !
docked๋ ํค๋ณด๋(์ผ๋ฐ ํค๋ณด๋, ์ ์ฐฉ๋ ํค๋ณด๋)๋ bottom์ ๊ฐ๊น๊ฒ ์๊ณ ๋ค๋ฅธ leading, trailing, top๊ณผ๋ ๋จ์ด์ ธ์์ต๋๋ค.
๋ง์ฝ ์ด๋ฐ์์ ๋ถ๋ฆฌ๋ ํค๋ณด๋๊ฐ ์์๋ top์ ์ ์ธํ ๋ชจ๋ edge๋ก๋ถํฐ ๋จ์ด์ ธ ์์ผ๋ฉฐ top์๋ง ๊ฐ๊น๊ฒ ์์ต๋๋ค.
Floating ํค๋ณด๋ ์ผ ๊ฒฝ์ฐ, ์ด๊ธฐ์ ํ edge๋ง near์ผ ๊ฒ์ ๋๋ค.
keyboard๋ฅผ ์์ง์ด๋ฉด, ๋์์ ๋๊ฐ์ ์ธ์ ํ near์ ๊ฐ์ต๋๋ค.
์ ๋ค์ ๋์์์, ๋ชจ๋ ์ด๋ฌํ ์์ฑ์ .followUndockedKeyboard๋ฅผ true๋ก ํ์๋ ์ ์ฉ๋ฉ๋๋ค.
Types of keyboards
Floating keyboard๋ ๋ชจ๋ edge๋ก๋ถํฐ ๋จ์ด์ ธ ์์ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ชจ๋ edge์์ ๋จ์ด์ ธ ์์ผ๋ฉด ์ฌ๋ฐ๋ฅด๊ฒ ๋ฐฐ์น๋ ์ ์๋ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์์ต๋๊น? ๋ํ ํค๋ณด๋๊ฐ ์๋์ชฝ edge์์ ๋จ์ด์ ธ ์๊ฑฐ๋ ์์ชฝ edge ๊ทผ์ฒ์ ์์ ๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ํค๋ณด๋์ topAnchor์ ์ฐ๊ฒฐ๋ ํญ๋ชฉ๋ ์ฃผ์ํด์ผ ํฉ๋๋ค.
์๋ก ์ฌ๋ผ๊ฐ ์ ์์ผ๋ ๋ง์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ ํค๋ณด๋๊ฐ bottom edge๋ก๋ถํฐ ๋ฉ์ด์ง๋, ํ๋์ view๋ฅผ ํค๋ณด๋์ topAnchor์์ ๋ฒ์ด๋ safeAreaLayoutGuide์ button์ผ๋ก ์ด๋์ํค๋ constraints๋ฅผ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฒ์๋ split undocked ํค๋ณด๋์ ๋๋ค.
๋ค์์ camera๋ฅผ ์ฌ์ฉํ ๋ ์
๋๋ค.
์ด๊ฒ์ ์ฌ์ ํ ํค๋ณด๋์
๋๋ค. ๋ฐ๋ผ์ guide๋ฅผ ์ฌ์ฉ ํ ์ ์์ต๋๋ค. Docked ํค๋ณด๋์ ๊ฐ์ง๋ง ์กฐ๊ธ ๋ค๋ฅธ ์ ์ ํ ์คํฌ๋ฆฐ์ด๋ผ๋ ์ ์
๋๋ค.
์ด์ ๋ํด์ https://developer.apple.com/videos/play/wwdc2021/10276 ๋ฅผ ์ฐธ๊ณ ํ์ธ์
ํ์ฌ์ด์ฆ๊ฐ ์๋ Shortcut bar
๊ธฐ๋ณธ์ ์ผ๋ก botton ๊ฐ๊น์ด ์์ง๋ง
๋๋น๊ฐ ์กฐ์ ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ๋์์ ๋๊ฐ์ near๋ฅผ ๊ฐ์ง์ ์์ผ๋ฏ๋ก ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ฉํฐ ํ์คํน์ ๊ฒฝ์ฐ์
๋๋ค.
window๋ฅผ ์ ์ฐจ ๋๋ฆฌ๊ฒ ๋๋ฉด ํค๋ณด๋๋ ๋ชจ๋ edge๋ก๋ถํฐ ๋ฉ์ด์ง๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ ํ top, buttom์ ๋ํด near์ ๊ฐ์ง ์ ์์ต๋๋ค.
๋ค์ docked ํค๋ณด๋๋ก ํ์ฅํ๋ฉด botton์ near์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
ํ๋ ์ ํฐ๋ถ์ด ์ ๋ง ์๋ถ์ฌ์ ๊ฐ์ง๊ณ ๊น๋ํ๊ฒ ์ค๋ช ํด์ฃผ์ ์ ์ด๋ฒ ์์์ ํตํด ํค๋ณด๋๋ฅผ ์กฐ๊ธ ๋ ๊ณ ๋ คํ ์ค ์๋ ๋๋ฒจ๋กํผ๊ฐ ๋๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
https://developer.apple.com/documentation/uikit/keyboards_and_input/adjusting_your_layout_with_keyboard_layout_guide ๋ ์ฐธ๊ณ ํด์ ํ๋ฒ ๋ณต์ตํด๋ด์ผ๊ฒ ์ต๋๋ค !!
'IOS๐ > WWDC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[WWDC 2021] Meet AsyncSequence (0) | 2022.12.18 |
---|---|
[WWDC 2021] Make blazing fast lists and collection views (0) | 2022.05.27 |
[WWDC 2021] Protect mutable state with Swift actors (0) | 2022.05.24 |
[WWDC 2021] Meet async/await in Swift (0) | 2022.05.17 |
[WWDC 2020] Advances in diffable data sources (0) | 2022.05.12 |
๋๊ธ