일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MVVM
- uiscrollview
- 애니메이션
- 스위프트
- map
- 클린 코드
- rxswift
- 리팩토링
- swiftUI
- RxCocoa
- tableView
- collectionview
- swift documentation
- SWIFT
- UITextView
- Refactoring
- ios
- Clean Code
- Protocol
- 리펙토링
- 리펙터링
- combine
- uitableview
- ribs
- HIG
- clean architecture
- Human interface guide
- Xcode
- Observable
- UICollectionView
- Today
- Total
목록iOS 응용 (SwiftUI) (57)
김종권의 iOS 앱 개발 알아가기
1. 위젯 Widget 사용 방법 - WidgetKit, WidgetFamily 2. 위젯 Widget 사용 방법 - API 데이터 로드와 위젯UI 업데이트 3. 위젯 Widget 사용 방법 - 위젯 딥링크 구현 방법 (widgetURL) 4. 위젯 Widget 사용 방법 - 위젯 이미지 로드 방법 5. 위젯 Widget 사용 방법 - Provisioning Profile 등록 (WidgetExtension) Widget 사용 방법 Minimum Deployment Target: iOS 14+ Apple에서는 매우 편리하게 Widget을 사용할 수 있도록 구현 Xcode -> File -> Target Widget Extension > Next > 이름 입력 후 Finish cf) Include Conf..
Swipe Down To Dismiss 구현 아이디어 .gesture()와 DragGesture를 사용하여 drag 제스쳐 구현 (gesture와 DragGesture 개념을 모른다면, 이전 포스팅 글 참고) gesture 안에서 y축이 얼마나 변했는지와, y축 velocity 값을 가지고 dismiss할것인지 결정 dismiss할때는 NavigationLink의 인수 중 Binding 프로퍼티인 isActive값을 false로 변경 구현 편리를 위해 CGSize extension으로 - operator 구현 extension CGPoint { static func - (lhs: Self, rhs: Self) -> Self { CGPoint(x: lhs.x - rhs.x, y: lhs.y - rhs.y)..
DragGesture drag 관련 액션 이벤트를 생성할때 사용 View 프로토콜을 따르고 있는 모든 곳에 .gesture()를 추가할 수 있는데, 이 gesture안에 들어가는 인스턴스가 DragGesture DragGesture()인스턴스에 onChanged, onEnded를 사용하여 드래그 이벤트 처리 var body: some View { Button("SomeButton") { print("tap button") } .gesture( DragGesture() .onChanged { gesture in } .onEnded { gesture in } ) } 뷰 드래그 구현 방법 프로퍼티 정의 draggedOffset: 드래그한 만큼 뷰가 움직이도록 binding에 사용될 프로퍼티 accumlated..
1. Pagination 방법 (페이지네이션, Combine) - 기초 2. Pagination 방법 (페이지네이션, Combine) - 메인 스레드 최적화, 이미지 캐싱 Pagination 개념 List에서 스크롤할 때 필요한 데이터를 계속 추가적으로 받아오는 형태 대용량의 데이터를 한꺼번에 받아오면 부하가 크므로, 10개를 보여주고 그다음 스크롤이 마지막에 도달할때 그 다음 10개를 보여주는 형식 API를 호출할땐 page Int 값을 다르게 보내면서 데이터를 가져오는 방법 SwiftUI 에서의 Pagination 구현 아이디어 List의 마지막 부분에 로딩뷰를 따로 추가하고, 그 부분이 onAppear 될때 페이지네이션 수행 List { ForEach(items) { item in } if !ite..
MVVM 핵심은 View와 ViewModel이고 각 역할을 기억 View: ViewModel에서 상태가 변하면 그 상태를 단순히 구독하고 있다가 View를 변경하는 역할 ViewModel: 상태 값을 저장하고 있고, 상태 값을 관리(계산 등)를 하는 역할 View와 ViewModel 구현 핵심 View에서 특정 UI의 action이 발생하면 ViewModel에 던져줌 ViewModel에서는 액션에 따라 특정 상태값을 관리하고 상태값을 변경 ViewModel의 상태값을 바라보고 있는 View는 그에 맞추어서 UI 변경 주의사항) 상태 관리 포인트는 View가 아니라 ViewModel이므로, 상태 관련 코드는 ViewModel 한 곳에서 수행되도록 할 것 View, ViewModel 구현 아이디어 enum을..
가장 일반적인 List 형태 List 하위에 NavigationLink가 있는 형태 import SwiftUI struct ContentView: View { var items = (0...100).map(String.init).map(SomeModel.init) var body: some View { NavigationView { List(items){ item in NavigationLink( destination: { Text(item.val) }, label: { Text(item.val) } ) } .navigationTitle("List 예제") } } } struct SomeModel: Identifiable { let val: String var id: String { val } } 오른쪽..
SwiftUI에서 Info.plist SwiftUI로 프로젝트를 생성하면 Info.plist가 없는 상태 프로젝트를 만들면 Info.plist 파일은 생성되지만, 위 파일에 노출되지않고 만약 info.plist 내용이 변경되면 노출 Info.plist파일을 Xcode의 Navigator에서 수정하지 말고 Target에 들어가서 수정할것 여기서 + 버튼을 클릭하여 새로운 key-value 추가 ex) 사진 저장을 위해 권한 요청하기 위해 NSPhotoLibraryAddUsageDescription 키값을 추가하여 사용 요약 SwiftUI 프로젝트에서는 Xcode 왼쪽에 위치한 Navigator에 Info.plist 파일이 보이지 않으므로, Target > Info 에서 설정해서 사용할것 * 참고 https..
네비게이션 바 검색 창 검색 창 구현 방법 List에 띄울 뷰와 데이터 모델 준비 struct SomeView: View { var name: String var body: some View { Text(name) } } struct SomeData: Identifiable { var name: String var id: String { self.name } } ContentView에 필요한 프로퍼티 준비 searchQueryString: 검색창에서 값을 입력할 때 입력될 프로퍼티 datas: 리스트에 표출할 데이터 filteredDatas: 검색 결과 필터링된 데이터 * 대소문자 상관 없이 검색하기 위해서 string.contains()가 아닌, string.localizedStandardContai..