본문 바로가기

Dev29

[SwiftUI] ObservableObject, ObservedObject, Published SwiftUI로 뷰와 로직을 작성하다 보면 데이터 관리에 대한 고민에 부딪히게 된다.특히 여러 뷰에서 동일한 데이터를 공유하고 업데이트해야 하는 상황에서 State나 Binding만으로는 한계가 있다. 이때 Combine 프레임워크의 핵심 요소인ObservableObject, ObservedObject, 그리고 Published를 이해하는 것이 중요하다. State와 Binding은 주로 상위-하위 뷰 간의 명확한 데이터 흐름에 적합하며, 단일 뷰 내부 또는 계층적으로 연결된 뷰에서 사용하기 좋다. 하지만 외부에 선언된 값을 여러 뷰에서 관찰하고 그 값의 변화에 따라 UI를 업데이트해야 하는 상황에서는 이벤트 변화를 관찰하는 ObservableObject와 ObservedObject가 더 적합하다. .. 2024. 10. 7.
[SwiftUI] Navigation 참여 중인 회사 프로젝트에서 UIKit과 SwiftUI 프레임워크를 함께 사용하고 있다. 탭바와 같은 화면 전환은 UIKit을 사용하고 있지만 사실 SwiftUI의 내비게이션 기능을 제대로 사용해 본 경험이 없었다. 대신 틈나는 대로 직관로그 UI를 SwiftUI로 리팩토링하고 있어서 겸사겸사 화면 전환 관련 로직을 다루기 전 사전 학습으로 SwiftUI의 내비게이션을 조금 뜯어보기로 했다. 참고로, 이 글에서 다룰 Navigation은 iOS 16 이상을 기준으로 작성했다. iOS 16 이전엔 NavigationView를 사용했지만, iOS 16에선 해당 API가 deprecated가 되었다.이 글에선 NavigationView에 대한 내용은 다루지 않을 예정이다. 애플 공식 문서에 따르면,.. 2024. 9. 24.
[SwiftUI] Infinite Carousel 구현하기 2 (feat.Timer) 회사 프로젝트에서 프로모션 팝업 화면을 담당하며 무한 스크롤과 타이머 작동을 동시에 구현해야 했다.그런데 이게 생각보다 만만치 않았다. 불과 일주일 전 같은 맥락의 게시글을 작성했었는데,그 방식대로 구현하면 타이머가 작동할 때 인덱스 변경 시 애니메이션이 적용되지 않는 문제가 발생했다. 그래서 해당 글에 추가해 두었던 블로그 글을 참고하여 전면 수정을 시도했다.하지만 이번에는 드래그를 할 때 해당 인덱스의 화면이 드래그되는 모습이 보이지 않고,액션이 다 끝난 후에야 슬라이드 애니메이션으로 화면이 전환되는 문제가 생겼다. 이전 글: https://calliek.tistory.com/62 [SwiftUI] TabView + DragGesture로 무한 스크롤 타이머 조절하기프로모션 팝업 화면을 담당해서 만들.. 2024. 9. 11.
[SwiftUI] Infinite Carousel 구현하기 1 (feat. Timer) 문제 프로모션 팝업 화면을 담당하며 무한 스크롤(이미지 배열 순환)과 타이머 작동을 동시에 구현해야 했다. 내가 구현하고자 했던 기능은 다음과 같다. 무한 순환 스크롤: 첫 번째 인덱스 이미지에서 왼쪽으로 스와이프하면 마지막 인덱스 이미지가 나오고, 마지막 인덱스에서 오른쪽으로 스와이프하면 첫 번째 인덱스 이미지가 나오는 구조를 만든다.자동 이미지 변경: 별도의 제스처가 없으면 3초마다 이미지가 자동으로 변경되고, 이미지 배열이 순환되도록 한다.수동 제어: 사용자가 수동으로 스와이프하면 배열 순서에 맞게 이미지가 변경되고, 인디케이터도 함께 변경된다. 하지만 구현 과정에서 몇 가지 문제에 부딪혔다. 이미지를 반만 스와이프했을 때, 반쯤 보이는 이미지들이 이전/다음 이미지로 변경되는 동시에 타이머가 작.. 2024. 9. 5.
[SwiftUI] scrollTargetLayout과 ScrollTargetBehavior iOS 17 이전까지 ScrollView는 제한적인 부분이 많았다. 특히 오프셋을 직접 구현해서 페이징 기능을 커스텀으로 만들어야 하는 불편함이 있었지만, 애플이 iOS 17에 scrollTargetLayout과 scrollTargetBehavior를 추가하면서 이제 단 두 줄의 코드만으로 이 기능 구현이 가능해졌다. 우선, 해당 기능에 대해 애플문서로 간략하게 알아보자. 정의scrollTargetLayout스크롤 액션이 일어날 때 어떤 레이아웃을 기점으로 스크롤이 이루어질지 정하는 역할을 한다.ViewAlignedScrollTargetBehavior와 함께 사용되어 스크롤 뷰가 특정 뷰나 콘텐츠에 정확히 정렬되도록 돕는다. ScrollTargetBehavior스크롤 가능한 뷰의 스크롤 동작을 정의하.. 2024. 8. 16.
[SwiftUI] pagerView 만들기 (iOS 버전대응) 회사 프로젝트에서 스크롤 뷰로 구현되어 있던 부분에 페이징 기능을 추가해달라는 기획서 수정이 있었다. UIKit으로 구현되어 있었다면 UIPageViewController를 사용하면 되겠지만, 프로젝트를 SwiftUI 중심으로 작업 중인 상황이라 생각보다 기획서대로 개발하는 것이 까다로웠다. 까다로웠던 이유는 두 가지였다.SwiftUI의 ScrollView는 커스텀이 제한적이라는 점회사 프로젝트의 최소 버전이 iOS 15 이상이라는 점그래도 iOS 17 이상부터 애플이 ScrollView의 기능을 대폭 추가 및 개선해 주어서 사실상 문제가 없었는데, 문제는 ScrollView의 버전 대응이었다. https://developer.apple.com/support/app-store App Store - S.. 2024. 8. 14.