본문 바로가기

전체 글

(10)
[SwiftUI] UICollectionView + SwiftUI 뷰 혼용해서 사용하기 *경험을 통해 쓰는 글로, 틀릴 수 있습니다. 1. SwiftUI를 혼용하게 된 계기 SwiftUI가 나온지 꽤 됐지만 당연히 대부분의 기존 프로젝트는 UIKit로 이루어져있다. 이런 상황에서 SwiftUI로 조금씩 변환하고 있는데, 아직 여러 제약사항이 많아서 부분적으로 진행하고있다. 가장 흔히 쓰이는 UICollectionView의 Cell에 SwiftUI 뷰를 적용하는 것부터 시작을했는데 간단하다고 생각했지만 의외로 복잡했다. 오늘은 이 과정에 대해 정리해보려한다! 2. 컬렉션뷰에서 사용하는 Cell에 SwiftUI View import SwiftUI 뷰 만들기 일단 Cell로 사용될 SwiftUI 뷰를 간단하게 만들어야한다. struct CellView: View { var number: Int ..
[SwiftUI] ForEach를 통해 뷰 생성 시 duplicated init 버그 1. 현상 현상은 iOS 16.0 이상에서 List, VStack 등 내부에서 ForEach를 통해 여러 뷰를 생성할 때 실제로는 뷰가 두 번씩 init된다는 것이다. 이렇다보니 뷰 생성 시 수행하는 로직이 있었는데 해당 로직이 불필요하게 2배씩 호출되는 이슈가 있었다. (body에는 한 번만 진입한다) 2. 샘플 코드 및 결과 아래는 간단하게 코드와 해당 코드의 실행 결과이다. struct ContentView: View { var numbers: [Int] = Array(1...10) var body: some View { VStack { ForEach(self.numbers, id: \.self) { number in NumberView(number: number) } } .padding() } }..
[iOS] 다크모드 지원: CGColor에 Dynamic Color 적용하기 새 회사에서 간단한 스펙들부터 처리하면서 천천히 팀에 녹아들고 있다. 그러다보니 주로 비즈니스 로직과 별도의 UI 관련 이슈들 위주로 보고 있는데, 그 중에 상당히 골아팠던 이슈가 있어서 기록해보려한다! 1. 다크모드 지원하기 다크모드를 지원하는 앱을 개발할 때 light, dark 모드에 각각 대응하는 컬러셋을 만들어주는 것이 일반적이다. 이렇게 해두면 light dark 모드 간 전환 시 색상이 바뀌어야하는 뷰들에 대해 매번 분기를 칠 필요 없이 위 색상으로 한번만 assign 해주면 된다. 코드로 예를 들어보면 아래와 같이 작성할 수 있을 것이다. self.dynamicColorTestView.backgroundColor = UIColor(named: "DynamicColorSet") 아주 간단하게..
[Swift][번역] 클래스 상속과 초기화 Part.2 *[Swift] 클래스 상속과 초기화 Part.1에 이어지는 내용입니다. Initializer Inheritance and Overriding Objective-C의 subclass와 달리 Swift의 subclass는 부모 클래스의 initializer를 기본적으로 상속받지 않는다. 이러한 Swift의 접근은 간단한 부모 클래스의 initializer가 더 구체화된(specialized) 서브 클래스의 initializer에 의해 상속되어 서브 클래스의 인스턴스가 완전히/제대로 초기화되지 않은 채 생성되는 문제를 예방한다. 만약 부모 클래스의 initializer와 동일한 서브 클래스에서 제공하기 원한다면 부모 클래스의 initializer들을 서브 클래스에서 커스텀하게 구현하여 제공할 수 있다. 부모..
[Swift][번역] 클래스 상속과 초기화 Part.1 Swift로 상속관계에 있는 클래스를 다룰 때 항상 init에서 말썽이 일어난다. 제대로 모르는 내 탓이오.. Swift 공식문서에 Class Inheritance and Initialization 파트가 있는데 이를 번역하면서 제대로 알아가보자. *본 글은 Part.1, 2로 나뉘어 포스팅됩니다. Part.1 Designated Initializers and Convenience Initializers Initializer Delegation for Class Types Two-Phase Initialization Part.2 Initializer Inheritance and Overriding Automatic Initializer Inheritance Designated and Convenience..