UIKit 15

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환)

SwiftUI로 Placeholder가 존재하는 TextField 설계 팁 (UIKit호환) 최근에는 SwiftUI와 UIKit을 정말 많이 혼용해서 사용하고 있음.특히 몇몇 컴포넌트들은 SwiftUI로 작성한 것들을 UIKit에서 가져다가 사용하는 컴포넌트들이 많은데, 서로 손쉽게 사용할 수 있도록 설계.  글의 순서구현 결과 스크린샷구현 예시 코드SwiftUI UsageUIKit Usage 구현 결과 스크린샷  구현 예시 코드구현 포인트 @State, @Binding을 외부에 직접 노출시키는 것이 아닌 Delegate를 통해 이벤트를 전달함.장점: UIKit에서 공통된 코드 규칙으로 편리하게 사용할 수 있음.  import SwiftUI/// 리스트에서 사용하는 검색 필드struct Search..

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기

SwiftUI 하위뷰에서 상위뷰로 DelegatePattern을 활용해 이벤트 전달하기  글의 순서상황어떻게 처리할까?코드 적용 예시마무리 상황홈 화면에서 프로필 리스트가 있는 네비게이션 방식으로 화면을 전환하고, 해당 화면에서 프로필을 전환하고 pop 혹은 dismiss로 홈 화면으로 돌아왔을 때, 프로필이 전환되어야 함. 즉, 하위 뷰가 상위 뷰로 프로필이 전환되었음(이벤트)을 알려야 함. 어떻게 처리할까?우선 UIKit에서라면 여러가지 방법이 있겠지만, 단순하게는 Delegate Pattern이 있음.SwiftUI에서는 Environment, preferenceKey를 활용할 수 있고, @State, @Binding을 활용해 하위 뷰와 연결할 수도 있음. SwiftUI에서 제안된 방법들은 사용..

지하철 검색 기능에 캐싱 로직 도입하기

지하철 검색 기능에 캐싱 로직 도입하기 지하철 검색 로직에 캐싱 로직을 도입. 글의 순서SearchSubwayUseCase 개선SearchSubwayUseCase 테스트를 위한 Stub 객체 만들기SearchSubwayUseCaseTests 캐싱 로직 동작 검증 코드SearchSubwayUseCaseTests 실패 후 로직 보완  지하철 검색 로직은 사용자가 키보드를 통해 검색어를 입력할 때 throttle을 활용해 약간의 시간을 두어 검색을 실행.여기까지는 우리가 일반적으로 사용하는 검색 로직. 동일한 값에 대해 서버 요청을 줄이고, 동일한 결과값을 더 빨리 제공할 수 있으므로 이점은 확실. SearchSubwayUseCase 개선기존에 Combine을 활용해서 처리하고 있었는데, cache 프로퍼티..

Library vs Framework 정리

Library vs Framework 정리 모듈화의 개념을 이해하기 전 기초 지식으로 정리. Library란?개발자가 만들 클래스들의 집합으로 다른  프로그램에서 사용할 수 있도록 제공Framework란?소프트웨어를 개발하는데 있어서 개발 시간을 줄이고, 코드의 재사용성을 증가시키기 위해 묶음이나 뼈대(틀)을 라이브러리 형태로 제공되는 것.제어의 역전 개념이 적용된 대표적 기술 Library와 framework의 차이라이브러리와 프레임워크의 차이는 제어 흐름의 주도성이 누구 / 어디에게 있는가가 포인트즉, 애플리케이션의 흐름(Flow)를 누가 갖고 있느냐의 차이프레임워크는 스스로 제어 흐름의 주도성을 갖는 반면, 라이브러리는 개발자가 가짐.  StaticLibrary / Dynamic Libarary ..

apple/iOS 2024.08.29

[WWDC24] UI 애니메이션 및 전환 효과 향상하기

[WWDC24] UI 애니메이션 및 전환 효과 향상하기 Intro- Transitions   - 화면 전환 및 프레젠테이션을 위한 새로운 고급 전환 방법 소개- SwiftUI animation   - SwiftUI animation과 UIKit 및 AppKit 간의 통합- Animating representables   - Representable을 통해 SwiftUI 애니메이션과 연결하는 방법- Gesture-driven animations   - 마지막으로 연속적인 제스처가 있을 때 UIView 및 NSView 애니메이션  Transitions SwiftUI에서 화면전환 새로운 API1. navigationTransitinStyle 추가2. matchedTransitionSource 추가 naviga..

apple/iOS 2024.08.05

[UIKit] appearance callbacks (화면 전환시 LifeCycle)

[UIKit] appearance callbacks (화면 전환시 LifeCycle) 기본적으로 UIKit에서 ViewController의 라이프 사이클은 위의 형태로 진행된다.  화면 전환 일반적인 경우 화면전환 과정에서 특별한 사용자의 액션이 없을 경우에는  (사용자의 액션이 없는 일반적인 경우)> push: Disappeared에서 시작해서 Appearing과정을 따름.> pop: Appeared에서 시작해 Disappearing과정을 따름.  (pop 과정 중 사용자의 인터렉션에 의해 취소된 경우)-> 사용자가 화면을 팝하려고 하다가 놓은 경우 즉, viewWillDisappear과 viewDidDisAppear사이이 경우에는 뷰가 바로 Disappeared 상태로 이동한 다음 사이클을 거치면서 ..

apple/iOS 2024.08.05

[UIKit] reloadSections에서 애니메이션 없애는 방법

reloadSections에서 애니메이션 없애는 방법 UITableView 혹은 UICollectionView를 사용할 때 reloadData()가 아니라 특정 섹션만 업데이트하는 reloadSections()를 사용할 수 있음. 특정 섹션만 업데이트 하는 것은 이점도 존재하나, 애니메이션이 들어가게 되어서 원하는 UX 결과물이 아니거나, 방송 실시간 채팅처럼 매우 빠른 속도로 데이터가 들어와 UI를 업데이트가 진행되는 경우 UI가 블락되거나, 심지어는 크래시가 발생하기도 함. Task { @MainActor [weak self] in guard let self else { return } UIView.performWithoutAnimation { self.reloadSections(in..

[iOS] infinite carousel DiffableDataSource + CompositionalLayout

[iOS] infinite carousel DiffableDataSource + CompositionalLayout UIKit에서 DiffableDataSource과 compositonalLayout을 사용하여 구현해보자. 전체 소스코드와 해당 코드에 대한 주석을 포스팅 제일 하단에 전부 넣어두었음. 예제 영상 무한히 회전하는 스크롤 뷰에 대한 구현 아이디어는 이미 많이 존재하나, 해당 포스팅에서는 diffableDataSource의 특성에 맞게끔 적용 (구현 방식) [앞에 붙는 id만 다른 원본] + [원본] + [뒤에 붙는 id만 다른 원본]을 먼저 구성한 후 한번에 apply diffable의 경우에는 데이터가 변경되었을 때, snapshot을 수정하는게 아닌 다시 찍음. 해당 부분은 iOS 13,..

apple/iOS 2024.04.16

[SwiftUI] keyboard 이벤트 핸들링

[SwiftUI] keyboard 이벤트 핸들링 앱 개발에 있어서 키보드 상태에 따라서 뷰의 다른 컴포넌트들의 높이가 조정되는 등 키보드와 관련해서는 꽤나 까다롭다. UIKit을 사용한다면 - iOS 15 이상: keyboardLayoutGuide를 활용하여 레이아웃을 잡기 - iOS 14 이하: 키보드의 상태에 따라 키보드의 높이를 계산해서 뷰의 위치를 조정 view.keyboardLayoutGuide SwiftUI 사용 - iOS 15 이상: @FocusState 활용 - iOS 14 이하: NotificationCenter와 Combine을 활용 샘플코드 키보드 상태를 읽을 수 있도록 아래 코드를 작성 protocol KeyboardReadable { var keyboardPublisher: Any..

[iOS] SwiftData in UIKit

SwiftData in UIKit 이번에는 SwiftData를 UIKit에서 사용해보자! CoreData를 학습하기 전에는 SwiftData가 진짜 어려웠는데, 지금은 훨씬 배우기 쉽다. SwiftData를 사용하면 CoreData와 개념적으로 부합하고 있어서 학습하는데 더 쉽게 느껴졌다. 또한 SwiftData가 가진 장점이겠지만, CoreData보다 검색이나 등등이 더 스위프트 언어와 잘 어울린다는 점. 다만 고려해야할 점으로는 @objc를 사용하는 서비스의 경우에는 도입하기가 조금 어려울 수 있다. 이번 실습 결과물 영상 - create: 아이템 추가 - read: 전체 아이템 reloadData - update: 트리 -> 산타의 선물로 데이터 갱신 - delete: 모든 데이터 삭제 실습용 코드..

apple/iOS 2023.12.15