๊น์ฑ์ผ๋์ ๋ฆฌ์กํฐ๋ธ ํ๋ก๊ทธ๋๋ฐ์ด๋? ๊ธ์ ๋ฉ์ธ์ผ๋ก ์ฐธ๊ณ ํ๊ณ ์์ต๋๋ค. - ์ด ๊ธ์ ๊ฐ์ธ์ ์ธ ํ์ต๊ณผ ๊ณต์ ๋ฅผ ๋ชฉ์ ์ผ๋ก ์์ฑ๋ ๊ธ์
๋๋ค. ์ฐธ๊ณ ํ ๋ ํผ๋ฐ์ค๋ ๊ธ์ ํ๋จ์ ๊ธฐ์ฌํด๋์์ผ๋ฉฐ ์๋ฌธ์ ๊ทธ๋๋ก ๊ฐ์ ธ๋ค ์ด ๋ด์ฉ๋ ์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค. ๋ค์ด๊ฐ๊ธฐ์ ์ RxSwift๋ฅผ ๊ณต๋ถํ๋ ค๊ณ ํ์๋์? ๊ทธ๋ผ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ์ด๋ ๋ฌด์์ธ์ง, Rx๊ฐ ๋ฌด์์ธ์ง ์์๋ณด๊ณ ์์ํ๋๋ก ํ์ฃ . ๊ธ์ ์ฝ๊ณ ๋๋ฉด ์ RxSwift๊ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ์ํ API์ธ์ง ์ดํด๊ฐ ์กฐ๊ธ์ ๊ฐ์ค๊ฑฐ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ Rx, Reactive Programming ๋ค์ ํค์๋์ ์๋ฏธ๊ฐ ๋ฌด์์ธ์ง๋ง ์๊ฒ ๋๋ค๋ฉด ์ฑ๊ณต์
๋๋ค. ๊ทธ๋ผ ๊ฐ๋ณด๋๋ก ํ์ฃ . Reactive Programming(๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ)์ผ๋ก์ ์ฌํ Reactive programmin..
FrameBaseLayout FrameBaseLayout + AutoResizing ์์ฆ์๋ ํด๋น ๋ฐฉ์์ผ๋ก๋ ๊ธฐ๊ธฐ๋ฅผ ์ ๋ถ ๋์ํ๊ธฐ ์ด๋ ค์์ง view.addSubview(emailTextField) // ํฌ๊ธฐ์ ์์น ๋ฐ ์์ฑ ์ ์ emailTextField.frame = CGRect(x: 50, y: 50, width: UIScreen.main.bounds.width - 100, height: 50) emailTextField.borderStyle = .line emailTextField.backgroundColor = .lightGray AutoLayout AutoLayout (๊ธฐ๊ธฐ๋ณ ๋์ ํ์) + NSLayoutConstraints Class(- base) AutoLayout ์์
์ AutoResi..
ํด๋น ์ฑ
์ ๊ฐ๋ณ๊ฒ ์ฝ์ผ๋ฉด์ ์๊ฐํด ๋ณด๋ ์๊ฐ์ ๊ฐ๋๋ก ํฉ๋๋ค. 1, 2์ฅ์ ์ฝ์ผ๋ฉด์ ์์งํ ๋ค์๋ ์๊ฐ์ ์ฌ๋ฏธ์๋๋ฐ ์์ง์ ์์ ํ ์ ๋ฟ์ง ์๋๋ค๋ ์๊ฐ์ด์๋ค. ์ฑ
์ ์ฝ์ผ๋ฉด์ ๊ณ์ํด์ ๋๋ ์๊ฐ์ ์ด๋ฅผ ์ด๋ป๊ฒ ์ฝ๋์ ์ ๋
น์ฌ๋ผ ์ ์์๊น๋ผ๋ ์๊ฐ์ด์๋๋ฐ ์ฌ์ค ๋๋ฌด ์์ฌ์ธ ๊ฒ ๊ฐ๊ธฐ๋ ํ๋ค. ์ฑ
ํ ๋ฒ ์ฝ๋๋ค๊ณ ์ ์ฉ์ด ์ฝ๊ฒ ๋๋ค๋ฉด ํ๋ก๊ทธ๋๋ฐ์ด ๋๋ฌด ์ฌ์ธํ
๋๊น ๋ง์ด๋ค. ๊ทธ๋์ ๊ทธ๋ฅ ๊ต์ ์ฑ
ํ ๊ถ ์ฝ๋๋ค๋ ์๊ฐ์ผ๋ก ๊ฐ๋ณ๊ฒ ์ ๊ทผํ๋ค. 1, 2์ฅ์์ ๊ฐ์ธ์ ์ผ๋ก ์ค์ํ๋ค๊ณ ๋๊ผ๋ ์ ์ ์ฉ์ด์ ๋ํ ์ดํด๋ฅผ ์ด๋ ์ ๋ ํด์ผ ํ๋ค๋ ์ ์ด์๋ค. ์ญํ , ์ฑ
์, ํ๋ ฅ, ๋ฉ์์ง, ์ํ, ํ๋ ๋ฑ ์ ๋ง ๋ค์ํ ์ฉ์ด๊ฐ ๋ฑ์ฅํ๋๋ฐ ์ด๊ฒ์ ์ ์ดํดํ๊ณ ์ฐ๋ฆฌ์ ํ์ฌ ์ํฉ์ ์ ๋น๋์ด ์๊ฐํ๋ ๊ฒ์ด ์ค์ํด๋ณด์๋ค. ๊ฐ์ฒด์งํฅ์ ํต์ฌ์ ํด๋์ค..
๊ธฐ์ ์ปจํผ๋ฐ์ค ๊ธฐ์ ์ปจํผ๋ฐ์ค, ๋ธ๋ก๊ทธ ์์ฃผ ๋ณด๊ธฐ! wwdc if kakao slash tech blog ๋ชจ๋ํ์ ์ ๊ทผ ์ ์ด ๋ชจ๋ํ ์์
์ ํ๋ค๋ณด๋ฉด ์ฌ๋ฌ ํ๋ก์ ํธ์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ๋ ์ฝ๋๊ฐ ์์ ์ ์๋ค. UI ์ปดํฌ๋ํธ, ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ํด๋์ค ๋ฑ๋ฑ์ด ์์ํ
๋ฐ ์ด๋ฅผ ๋งค ํ๋ก์ ํธ ๋ด์์ ์ง์ ์์ฑํด์ฃผ๋ ๊ฒ๋ณด๋ค ๋น์ทํ ์ฑ๊ฒฉ์ ์ฝ๋๋ผ๋ฆฌ ๋ชจ์์ ์ข ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ค. ํ๋ ์์ํฌ๋ฅผ ๋ง๋ ๋ค๊ณ ๋ ์ดํดํด๋ณผ ์ ์์ ๋ชจ๋ํ๋ฅผ ํด๋ณด๋ฉด ์ ๊ทผ ์ ์ด์ ๋ํ ๊ฐ๋
์ด ์กฐ๊ธ ๋ช
ํํด์ง (- ์ค์ ๋ก ๋ด๊ฐ EasyKit์ด๋ผ๋ ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ ๋๊ผ๋ ๋ถ๋ถ์ด๋ค.) ์ค์ ํ๋ก์ ํธ๋ ์กฐ๊ธ ๊ฐ๋ฒผ์์ง ๊ฐ๊ฐ ์ญํ ์ ๋ํ ๋ถ๋ฆฌ๊ฐ ๋ช
ํํด์ง ์์ฃผ ์ฌ์ฉํ๋ ์ฝ๋, UI ๋ชจ์๋๊ธฐ ์ ๊ทผ ์ ์ด ์ด๋ก ์ ์ผ๋ก ์ ๋ฆฌํ๋ ๊ฒ๋ ์ค์ํ์ง๋ง..
UIButton.Configuration iOS 15.0๋ถํฐ ์ด์ฉ ๊ฐ๋ฅ Struct ํ์
๊ธฐ๋ณธ ์ ๊ณต Configuration ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ๋ฒํผ ์คํ์ผ์ด ํ์
๋ฉ์๋ ํํ๋ก ๋ง๋ค์ด์ ธ์๋ค. Configuration ํ์ฅ ๋งค๋ฒ configuration์ ๋ฒํผ๋ง๋ค ๋ง๋ค์ด ์ฃผ๋๊ฒ ์ฝ๋ ๋ผ์ธ๋ ๊ธธ์ด์ง๊ณ ๊ท์ฐฎ์๋๋ฐ ๋ฉํ ๋๊ป์ ๋ง์ํด์ฃผ์ extension์ผ๋ก ํ์ฅํ๋ค๋ ๊ด์ ์ด ์ข์๋ค. ํ๋ก์ ํธ ๋ด์ ๋ฒํผ ์คํ์ผ์ด ๋ช ๊ฐ์ง ์๊ฑฐ๋ ์ผ์ ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ง๋ค์ด์ฐ๋ ๊ฒ์ด ์ข์๋ณด์ธ๋ค. (๊ธฐ๋ณธ ์ ๊ณต ์คํ์ผ๊ณผ ๋์ผํ ์์ด๋์ด ์ธ ๊ฒ ๊ฐ๋ค.) ์งํ ์ค์ธ ํ๋ก์ ํธ ์์ ์์ง ์ค์ ๋ก ์ ์ฉํ์ง๋ ์์์ง๋ง, ํ๋ก์ ํธ ๋ด์ 3๊ฐ์ง ์คํ์ผ์ ๋ฒํผ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์. ๊ทธ๋ฐ ๊ฒฝ์ฐ์ ์ด๊ฑฐํ(Enum)๊ณผ Configuration ํ์ฅ์ ..
๋์๋ณด๋ฉฐ ์์น ๊ณผ์ ์ ์์ํ๊ณ ๋ฒ์จ 30๋ฒ์งธ TIL์ด๋ค. (1, 2์ผ์ฐจ TIL์ ์ด์ฉ๋ค ๋ณด๋ ๋นผ๋จน๊ฒ ๋์์ง๋ง) ์ฐธ ์๊ฐ ๋น ๋ฅด๋ค... ์ฒ์์๋ ์๋ฒฝํ๊ฒ ์ฐ๊ณ ์ถ์ด์ ๋ฏธ๋ฃจ๋ค๊ฐ ์ ๋ง ๋ง์ด ๋ฐ๋ ธ์๋๋ฐ ์ด๋ฌ๋ค๊ฐ ํ๋๋ ๋ชป ์ธ ๊ฒ ๊ฐ์์ ๊ฐ๋จํ๊ฒ ํ๊ธฐํด ๋๋ ๊ฑฐ ์งค๋งํ๊ฒ ์ฌ๋ฆฌ๋ ํํ๋ก ๋ฐ๊พธ์๋ค. ๋์ค์ ๋ค์ ์ฐพ์๋ณผ ์ ์๋ ํค์๋๋ฅผ ๋ชจ์๋์๋ค๊ณ ์๊ฐํ๋ฉด ์ถฉ๋ถํ ์ข์ ์์ฐ์ด ๋์ง ์์๊น ์ถ๋ค. (30์ผ์ฐจ๊น์ง ๊ทธ๋๋ ๋ช ์ ์ ์ผ๋ ค๊ณ ๋
ธ๋ ฅํ ๊ฒ์ ์นญ์ฐฌํ๋ค.) ์ฌ๊ธฐ์ ์์ฒด ํผ๋๋ฐฑ์ ํ์๋ฉด, TIL์ ๊ทธ๋ ๊ทธ๋ ์ฐ๋๊ฒ ๋ฒ ์คํธ์ธ ๊ฒ ๊ฐ๊ณ ํค์๋๊ฐ ์๋ค๋ฉด ๊ทธ์ ๋ํด ๊ณ ๋ฏผํ๋ ๋์ ์๊ฐ์ ์ต๋ํ ๋ง์ด ์ ๋ ๋ฐฉ์์ผ๋ก ๋ณด์ํด๋๊ฐ๋ ค๊ณ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ ์กฐ๊ฐ๋ ๋ง์ด ๋ชจ์๋์ผ๋ฉด ์ข๊ฒ ๋ค๊ณ ์๊ฐ์ด ๋ ๋ค. ์ฌ์ค 30์ผ์ฐจ๊น์ง์ TIL์ ๋ด์ฉ์..
MapView ์ธํฐํ์ด์ค ๋น๋ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ๋ฒ์ ์ฒดํฌํด๋ณด์ import MapKit // ํ๋ฉด์ MKMapView ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ ์์๋ ์ ์ฐ๊ฒฐํ์ @IBOutlet weak var mapView: MKMapView! let center = CLLocationCoordinate2D(latitude: 37.000000, longitude: 126.000000) // Region ์ค์ // ์ง๋ ์ค์ฌ ๊ธฐ๋ฐ์ผ๋ก ๋ณด์ฌ์ง ๋ฒ์ ์ค์ let region = MKCoordinateRegion(center: center, latitudinalMeters: 1000, longitudinalMeters: 1000) mapView.setRegion(region, animated: true) // Annotation ์ค์ (..
ReusableView Protocol ๊ธฐ์กด์ cell ๋ง๋ค id๋ฅผ ํ์
ํ๋กํผํฐ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ด ํ๋กํ ์ฝ๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ protocol ReusableViewProtocol { static var reuseIdentifier: String { get } } extension UICollectionViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: self) } } extension UITableViewCell: ReusableViewProtocol { static var reuseIdentifier: String { return String(describing: ..