일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Clean Code
- SWIFT
- HIG
- 애니메이션
- uitableview
- tableView
- Xcode
- combine
- ribs
- 리펙터링
- UICollectionView
- Human interface guide
- Protocol
- Observable
- swiftUI
- 리펙토링
- RxCocoa
- MVVM
- UITextView
- ios
- 클린 코드
- 스위프트
- Refactoring
- rxswift
- collectionview
- swift documentation
- clean architecture
- 리팩토링
- uiscrollview
- map
- Today
- Total
목록로딩 (5)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/JzkBW/btsxg1AuPqb/YjhCqHKCusbgmKO46mIkTK/img.gif)
하단 로딩 구현 아이디어1단계) Pagination: tableView의 willDisplay 델리게이트에서 마지막 인덱스 값인지 체크하고, 마지막 인덱스 값이면 페이지네이션 구현2단계) 하단로딩: willDisplay에서 페이지네이션이 되기 전에 tableView의 footerView에 indicator가 있는 UITableViewHeaderFooterView를 대입해주고, 데이터가 들어오면 다시 footerView.tableFooterView를 nil로 초기화하단 로딩 구현pagination 형태 구현class ViewController: UIViewController { private let tableView: UITableView = { let view = UITableView(..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/ouOYX/btrvIxOZVxW/0QLpEEKAptBqPZLL7lyyk1/img.png)
* 구현에서 편리한 레이아웃 작성을 위해 사용한 프레임 워크 pod 'SnapKit' 구현 아이디어 AutoLayout을 이용하여 progressBar의 width를 업데이트하면서 progressBar 구현 progress를 업데이트하면 로딩이 매끄럽지 않고 끊겨져 보일 수 있으므로, UIView.animate 사용 구현 ProgressBarView 정의 import UIKit import SnapKit final class ProgressBarView: UIView { } progressBarView 뷰 정의 private let progressBarView: UIView = { let view = UIView() view.backgroundColor = .systemBlue return view }(..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OoMIs/btrdC5uh8jI/pDaO3RVAektOAUKtz7fy1k/img.gif)
UIActivityIndicatorView를 상속받아서 구현 로딩중이면 다른 화면의 UI가 눌려지지 않도록 구현 중앙에 표출 구현 사용 시 매번 객체생성이 필요 없으므로 static으로 사용할 수 있게끔 선언 class LoadingIndicator { static func showLoading() { DispatchQueue.main.async { // ... } } static func hideLoading() { DispatchQueue.main.async { // ... } } } showLoading 구현 최상단에 있는 window 객체 획득 window의 subviews들 중 마지막에 있는 화면이 UIActivityIndicatorView면 그대로 사용하고, 아닐 경우 객체를 새로 생성 UIA..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/O4yoe/btrbAIhNdXs/zt13qkxwZQbyNQ3x9OONh0/img.gif)
* URLSession 개념 참고 * NSCache 개념 참고 TableView에서 refresh시 데이터 요청 dataSource는 [AnyObject]형태 title과 같은 것은 dataSource안에 포함 되어 있지만 이미지같은 경우는 dataSource중 url link를 통해 이미지 획득 url link를 통해 이미지를 획득할때 시간이 오래걸리므로 cellForRowAt에서 cache와 async방법으로 접근 class ViewController: UIViewController { lazy var refreshControl: UIRefreshControl = { let control = UIRefreshControl() control.addTarget(self, action: #selector(..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c5dDxK/btqOhNM7SZK/HWWNigbczy5gfVWTkkVrN0/img.gif)
해당 프레임 워크가 좋은 이유 비동기 처리할 때 다른 로딩 뷰에 비해서 오류 x 로딩 뷰가 등장하면 뒤에있던 뷰들을 클릭하지 못함(안전상태) 자동으로 중앙에 배치 의존성 pod 'JGProgressHUD' BaseViewController생성하여 여기에 로딩관련 로직 추가 ( 재사용성을 위함 ) // // BaseViewController.swift // Test // // Created by 김종권 on 2020/11/26. // import Foundation import UIKit import JGProgressHUD class BaseViewController: UIViewController { lazy var hud: JGProgressHUD = { let loader = JGProgressHU..