일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- DateFormatter
- firebase
- Network
- CS
- iphone
- Algorithm
- gesture
- UIKit
- RxSwift
- stateobject
- SwiftData
- arkit
- GCD
- authentication
- ios
- 알고리즘
- swift
- WWDC
- async
- auth
- SwiftUI
- state
- combine
- Concurrency
- Animation
- dataflow
- 최적화
- sheet
- withAnimation
- date
- Today
- Total
목록Swift/SwiftUI (19)
XLOG
왜 이 구조를 도입했나앱 기획이 바뀌고 기능이 추가될 때마다 navigationDestination, sheet, fullScreenCover가 군데군데 늘어나고, 상태 변수도 화면마다 따로 생기곤 합니다. 화면 수가 많아질수록 가독성은 떨어지고 실수가 늘죠.저는 “어떤 View에서든 안전하게 시트를 띄우고, 스택을 쌓고, 쉽게 닫을 수 있는 단일 API”를 목표로 라우터/코디네이터를 도입했습니다. 결과적으로 화면 전환 코드가 뷰 구현에서 분리되어 테스트 가능하고 확장 가능한 구조를 갖게 되었습니다.설계 목표관심사 분리: 화면 전환(네비게이션)은 뷰 로직에서 분리단일 소스: push/pop, present/dismiss를 한 곳에서 관리모달 독립성: 시트/풀스크린 내부도 자체 네비게이션을 가질 수 있게확..

SwiftUI 를 사용하다가 보면 .toolbar 나 .onChange 같은 함수들이 iOS 17.0 을 기준으로 deprecated 되어 분기처리를 해야하는 경우를 마주하게 된다. 하지만 매번 사용하는 곳에서 분기처리 하는 코드를 사용하는 건 비효율적이기에 View 의 extension 을 사용하면 중복된 코드를 줄일 수 있다.먼저 onChange의 변화점에서 공통점을 찾아보자.바뀐점은 17 이상에선 initial 이라는 인자를 받는데 이건 initial 될 때 액션을 발생시킬지를 결정하는 값이다.그리고 두 번째로는 변화값을 받아서 전달해주는 action handler 가 17 이전에는 바뀐 값 하나만을 전달해줬다며, 17 이상부턴 바뀌기 전과 후 모두를 전달해준다. 여기서 공통점은 결국 어떠한 값(..

2022년 애플아카데미에 있을 때 Accessibility 관련 주제에 대해 얘기를 들은 적이 있었다.옛 직장에서 홍보관 리뉴얼을 진행할 때 휠체어를 탄 사람들이 관람하기 어려운 곳이란 판단에 그 부분에 대한 업데이트를 요청한 적이 있었다. 국내 성인이면 누구나 알만한 대기업이 었지만 금액, 효율 등의 이유로 바로 반려당한 적이 있던 나였다.하지만 Apple 은 아카데미를 오픈할 당시 자동문의 사이즈가 휠체어 사용자를 위한 사이즈를 충족하지 못하였기에 오픈을 연기했었다. 그런 기억이 있기에 Accessibility 에 관한 내용을 처음 접했을 때 어떤 유저든 사용편의성을 주기 위한 노력을 하는 기업이구나란 생각을 했고, 나도 앱을 개발하게 되면 그런 노력을 해야겠다고 생각을 했는데....여태 잊고 있다 ..

1. Observation 이란?wwdc 23 에서 발표한 observation 은 프로퍼티의 변화를 추적하는 Swift 기능으로 같은 wwdc 23 에 발표한 swift 5.9에 신기능인 매크로를 사용하여 정의한 데이터 타입을 observable 하게 바꿔주는 기능이다.2. 사용방법정의한 class 에 @observable property wrapper 를 붙여준다.import Foundationimport Observation@Observable class DataModel { var count: Int = 0}이를 View 에서 사용할 땐 @State, @Environment, @Bindable, var 를 사할 수 있다. 여기서의 기준은View의 부분일 경우 @State, 글로벌하게 변수를 사용할..

1. SwiftUI 는 언제 View를 Update 하는가?우리가 SwiftUI 를 사용하며 View 를 정의할 때 @State, @StateObject 와 같은 변수를 정의하게 되면 View 는 Source of truth 를 만들어 관리를 한다. 이때 UI 를 통해 Action 을 발생시켜 Source of truth 의 값의 변화를 준다면 그 값의 변화를 View 에 알리고 View에서는 body 를 다시 compute 를 한다. body를 다시 compute 한다는 것은 body 내부에 코드를 한줄한줄 실행을 해준다는 의미이다.2. 그렇다면 어떻게 Update 를 최소화 하는가?2-1. SubView를 사용하여 View가 의존하는 변수를 최적화한다.위에서 설명을 했지만, View 가 추적하고 있는..

1. StateSingle source of truth 로 View 에서 PropertyWrapper 로 정의 한다. 그로 인해 View 와 따로 독립적으로 SwiftUI 가 데이터를 관리해 주며 생명 주기는 View 의 생명주기와 동일하다. State 값의 변화를 view에 알려주면 View 는 re-render 한다.단 해당 State 가 정의된 View 의 body 내부에 직접적으로 state 값을 활용하여 View 의 내용이 달라지는 요소가 없다면 re-render 하지 않는다.import SwiftUIstruct ParentView: View { @State var count: Int = 0 var body: some View { VStack { ..

1. Environment 란 무엇인가?property wrapper 로 view의 environmentValue 를 읽는데 사용할 수 있다. 그렇다면 EnvironmentValues 는 무엇일까?view 계층을 통해 값을 전달해주는 역할을 한다. 이는 preferenceValue 와 반대되는 개념이다.2. 사용 방법// 정의struct MyEnvironmentKey: EnvironmentKey { static var defaultValue: Bool = false}extension EnvironmentValues { var myEnvironmentValue: Bool { get { self[MyEnvironmentKey.self] } set { self[MyEnvir..
친한 개발자와 얘기를 하다가 밀리의 서재에서 책을 클릭했을 때 나오는 Animation 얘기가 나와서 어떻게 구현했을까 고민을 하다가 SwiftUI 로 구현해봐야 겠다 생각해서 시작한 일이다. 1. 문제점기존에 Namespace 를 사용할 경우 기존 view 가 없어져야함, 하지만 위에 화면을 보게되면 기존 ScrollView는 항상 있어야 함Scroll 에 따라서 해당 View 가 가지고 있는 크기 및 위치값인 CGRect 를 Update 를 해주기 위해선 PreferenceKey 를 사용해야 하는데 PreferenceKey 의 경우 하위 View 에서 상위 View의 값을 전달할 때 사용하는 것인데, FullScreenCover 는 CellView 의 상위뷰가 아님present 할 때와 dismiss..

SwiftUI 의 경우 기본 Sheet, FullScreenCover를 제공한다. 하지만 이 경우는 Sheet 의 크기가 정해져 있다.하지만 일을 하며 디자이너가 Content 의 사이즈에 맞는 Sheet 를 원했다. 그를 위해 안에 들어가는 Content 의 사이즈를 확인하여 동적으로 Sheet의 크기를 결정할 수 있는 CustomSheet 를 만들어야 겠다고 생각했다.이 때 필요한 것은 CustomSheet 내부 Content 의 사이즈를 알 필요가 있었다.그것을 위해 이전 SwiftUI Scroll value를 확인할 때 사용했던 PreferenceKey 를 사용하기로 했다.struct CalculateSize: PreferenceKey { static var defaultValue: CGSi..

기존 UIKit의 UIButton 의 경우 setTitleColor 를 통해 highlighted에 따라 색상을 변경할 수 있었다. 하지만 SwiftUI 에선 자동으로 Button에서 처리가 되기도 하지만 Custom Label의 경우는 그것이 쉽지 않다. 방법은 간단하다. ButtonStyle 을 구현하는 것이다. ButtonStyle 은 Protocol 로 Makebody 함수를 통해서 View 를 return 한다. 또한 makebody에 configuration 에는 label, isPressed 가 있다. 여기서 isPressed 가 바로 highlighted 와 비슷하다고 보면 된다. 구현은 간단하다. struct CustomButtonStyle: ButtonStyle { func makeBo..