일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- human interface guidelines
- Modality
- Codegen
- Structures and Classes
- 독후감
- Mock
- Navigation
- 부트캠프
- delegation
- UIResponder
- xcode
- Info.plist
- NumberFormatter
- viewcontroller
- 야곰아카데미
- 독서후기
- Failed to register bundle identifier
- mvvm
- 스타트업주니어로살아남기
- 책후기
- View Life Cycle
- NotificationCenter
- SWIFT
- 스위프트
- IOS
- SWIFTUI
- @available
- contentInset
- roundingMode
- 아이폰
- Today
- Total
목록IOS (19)
호댕의 iOS 개발
만약 다른 사람들이 특정 코드를 사용하지 못하도록 하려면 어떻게 처리를 해줘야 할까? 예를 들어 이런 코드가 있다고 생각을 해보자. required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } 해당 코드는 스토리보드에서 ViewController를 생성할 때 호출되는 생성자이다. 만약 따로 생성자를 정의하면서 required init?을 불가피하게 생성을 했다고 가정한다면 required init?은 다른 곳에선 사용을 하지 못하게 해야 한다. required init을 통해 VC를 생성하지 않고 따로 정의한 생성자로 VC를 생성해야 하기 때문이다. 이때는 available attribute를 사용하면 된다. ..
최근 프로젝트를 진행하며 RxSwift, RxCocoa를 사용하게 됐다. 또한 기존 MVC 패턴을 사용해 주로 개발을 진행했지만 MVVM 디자인 패턴을 새롭게 사용해봤다. 물론 아직은 부족한 점이 많지만 그래도 프로젝트를 진행하면서 알게 된 MVVM은 무엇이고 어떻게 적용을 할 수 있는지 정리해보고자 한다. 🔸 그 전에 MVC 패턴부터... 일단 기존에 사용하던 MVC 패턴의 경우 Model, View, Controller로 나뉘게 된다. 애플에서도 CocoaMVC를 기본적으로 사용했다. View : 사용자가 직접 볼 수 있는 객체로, 스스로 어떻게 그려지는지를 알고 있으며, 사용자의 Action에 응답할 수 있다. ViewController : 하나 이상의 View와 하나 이상의 Model을 중재하는 ..
iOS 14 이후부터 위젯 기능을 사용할 수 있게 되었다. (물론... 안드로이드에선 진작 있긴 했지만... ) 위 아이패드 화면에서 흰 색 테두리로 표시해놓은 부분이 위젯이다. 이를 통해 사용자에게 앱에서 중요한 내용을 홈 화면에서 상시 노출을 할 수 있는 것이다. 일단 위젯도 AppExtension의 한 종류인 만큼 App Extension에 대해 먼저 알아보자. 🛠 App Extension 🔸 App Extension 추가해보기 이를 통해 홈 화면에 위젯으로 앱을 표시하거나, 액션 시트에 새 버튼을 추가하거나, 사진 앱 내 사진 필터 제공 등의 작업을 수행할 수 있다. 이런 App Extension은 Xcode의 File > New > Target을 누르면 추가를 해줄 수 있다. 이렇게 해주면 이렇..
연락처 앱이나 메모 앱을 켜보면 스와이프 기능이 있는 경우가 있다. 스와이프를 통해 해당 셀을 삭제하거나 공유할 수 있도록 하는 것이다. 이는 굳이 버튼을 누르지 않더라도 직관적으로 스와이프 동작을 통해 원하는 액션을 동작할 수 있도록 할 수 있다. 그렇다면 이런 스와이프 기능을 구현하려면 어떻게 해야할까? 🛠 관련 메서드 이는 UITableViewDelegate에 관련된 메서드를 사용하면 된다. func tableView(_ tableView:leadingSwipeActionsConfigurationForRowAt:) -> UISwipeActionsConfiguration? func tableView(_ tableView:trailingSwipeActionsConfigurationForRowAt:) -..
만약 이런 식으로 TextField나 TextView에 테두리 대신 그림자를 주고 싶다면 어떻게 해야 할까? UIView의 layer에는 다음과 같은 속성들이 있다. shadowColor : 그림자의 색을 정해줄 수 있다. (CGColor) shadowOffset : 그림자가 어디로 얼마나 퍼져있을지를 정해줄 수 있다. 기본값은 (width: 0.0, height: -3.0)이다 (CGSize) shadowOpacity : 그림자의 투명도를 정해줄 수 있다. 0.0에서 1.0의 범위에서 정해줄 수 있으며 기본 값은 0.0이다. shadowRadius : 그림자가 얼마나 둥근지(곡률) 정해줄 수 있다. 하지만 여기서 TextField와 TextView의 차이가 존재한다. 기존에는 layer.masksToB..
Array에서 값을 꺼내올 때는 .first나 .last로 꺼내올 수도 있지만 특정 인덱스를 꺼낼 때에는 Array[index], 이런 형태로 값에 접근하게 된다. 하지만 이 때 .first나 .last는 옵셔널 타입으로 만약 값이 없다면 nil이 나오게 되지만 [index]의 형태로 값을 접근했을 때 해당 인덱스에 해당하는 값이 존재하지 않을 경우 아예 fatal error가 발생하게 된다. (Fatal error: Index out of range) 즉, 값에 잘못 접근하게 될 경우 아예 앱 자체가 죽어버리는 것이다. 그럼 [index]의 형태로 값에 안전하게 접근할 방법은 없을까?? 이를 위해선 직접 Array의 extension으로 subscript를 정의해주면 된다. extension Array..
물론 나도 다양한 라이브러리를 사용해보진 못했지만 이번에 야곰 아카데미에서 프로젝트를 진행하며 어떤 라이브러리를 선택할 지 고민할 수 있는 기회가 있었다. 써보지도 않은 라이브러리.. 어떻게 판단할 수 있을까? 자기가 좋은 라이브러리라고 딱 보이지도 않는데 말이다. 라이브러리를 한 번 쓰고 말 것이 아닌 만큼 해당 라이브러리가 안정적으로 운용이 될 것인지, 미래에도 지속적으로 사용될 것인지에 대해 판단해야 한다. (물론 자기 프로젝트에 적합한 라이브러리인지 파악하는 것이 가장 중요할 것이다) 특히 라이브러리에 맞춰 코드를 작성하다보면 이후 해당 라이브러리를 사용하지 않을 경우 리팩토링이 까다로울 수 있기 때문에 처음부터 신중히 고민을 하고 선택을 할 필요가 있다. 1️⃣ Github Star 확인하기 일..
프로젝트를 진행하다보면 종종 키보드를 활성화했을 때 키보드 때문에 뒤에 있는 컨텐츠의 일부가 아예 보이지 않는 문제가 발생하곤 한다. 화면 위에 키보드가 활성화되어 아무리 뒤에 있는 View를 스크롤 하더라도 보이지 않는다... 😱 이는 사용자가 자신이 작성한 내용을 확인할 수 없기 때문에 사용자 경험을 매우 안 좋게 하는 요인이라고 생각한다. 그렇다면 이럴 땐 어떻게 해야할까? 일단 이 때는 키보드의 높이만큼 컨텐츠가 위로 올라가야 하지 않을까? 라고 생각하고 방법을 찾아보았다. 그 전에 키보드가 활성화되었고, 키보드가 비활성화되는지 알 수 있는 방법이 필요했다. 이는 이미 만들어져 있는 Notification Center를 사용하면 해결됐다. 내가 사용한 것은 UIResponder에 있는 타입 프로퍼..