일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 애니메이션
- tableView
- Observable
- Human interface guide
- collectionview
- uitableview
- ios
- 클린 코드
- MVVM
- UICollectionView
- rxswift
- Protocol
- clean architecture
- swiftUI
- UITextView
- swift documentation
- 리팩토링
- uiscrollview
- Xcode
- RxCocoa
- Clean Code
- combine
- Refactoring
- ribs
- SWIFT
- 리펙토링
- 스위프트
- 리펙터링
- map
- HIG
- Today
- Total
목록ios (1095)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bmdMiv/btrdIlQNAYn/VHi0dLMS29B8oBEyda5hk1/img.png)
viewIfLoaded 개념 뷰 컨트롤러의 뷰가 로드된 경우, UIView 표출 뷰 컨트롤러가 현재 화면에 보여지는지 확인하는 코드 viewIfLoaded?.window != nil // true이면 현재 보여지는 화면, flase이면 현재 보여지지 않는 화면 확인 - navigationController 두 번째 화면에서 notificationCenter로 각각 ViewController에서 viewIfLoaded?.window가 nil인지 체크 첫번째 화면 class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() NotificationCenter.default.addObserver(self, se..
![](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/bfjm43/btrdDypyMkP/vrPs3KHpzDSAVuLzHKPCKk/img.png)
사각형을 자르고 싶은 경우, divided(atDistance:from:) 사용 from의 좌표로 부터 adDistance 떨어진 것으로 사각형 slice 하나의 사각형(CGRect)을 두 개의 사각형(CGRect)로 slice하는 코드 Rect객체에서 divided(atDistance:from:)을 사용 // .minXEdge 의미: x좌표의 시작점을 기준으로 30의 길이로 slice let slices = originRect.divided(atDistance: 30.0, from: .minXEdge) let slicedRect = slices.slice let remainderRect = slices.remainder sliceView.frame = slices.slice remainderView.f..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/eeL63x/btrduIFvSor/xdkw07giSyEKkg7LGVVLU1/img.png)
CollectionView의 연산 3가지 insert, move, delete 3가지 연산의 dicussion에 모두 performBatchUpdates를 사용하여 각 연산의 변경을 동시에 animate를 줄 수 있는 방법 performBatchUpdates(_:completion:) 여러개의 변경 후 completion 블럭을 사용할 수 있기 때문에 사용 코드의 순서에 상관 없이 insert 연산전에 delete 연산이 수행됨을 주의 > 삭제 후 index값 기준으로 index가 처리되므로 주의 performBatchUpdates(_:completion:) 사용 collectionView 준비 class ViewController: UIViewController { // Views lazy var co..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bKVqj4/btrdqjGmqkB/bUwWJFei6TqwbsXkgRUpkK/img.png)
스위프트에서의 layoutMagins 개념 현재 뷰의 경계와 content와의 여백 개념 혼동 주의: 현재 뷰 경계와 superview와의 여백이 아님을 주의 storyboard에서 layoutMargins 확인 방법 Editor > Canvas >Layout Rectangles layout 설정 시 "Constrain to margins" 옵션을 체크한 후 autolayout적용 시 view 내부에 margin값을 고려한 배치 cf) code에서 layoutMarginsGuide 주는 방법: layoutMarginsGuide. 으로 접근 imageView.leadingAnchor.constraint(equalTo: layoutMarginsGuide.leadingAnchor) 내부 label이 margi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bcAHDK/btrlqLwiioI/EXPjLS9nwtX4P1mmeztnPk/img.png)
dataSource와 filterDataSource 따로 두고, 검색창이 활성화 된 상태 && 글자가 한글자라도 입력되면 filterDataSource 표출 filterDataSource는 UISearchResultsUpdating의 updateSearchResults(for:) 델리게이트에서 업데이트 구현 방법 viewController에 navigationController embed 상태 dataSource는 2벌 준비 (전체 dataSource, filterDataSource) var dataSource: [String] = ["iOS", "iOS 앱", "iOS 앱 개발", "iOS 앱 개발 알아가기", "iOS 앱 개발 알아가기 jake"] var filteredDataSource: [Stri..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/TQJWl/btrc8gYr1mL/hzXgYDmZT7SyBiCU0Gw3ek/img.gif)
CheckBoxCell 구현 isCheck라는 property가 있고, 이 property를 통해 check되면 체크 이미지를 업데이트하고 값을 가지고 있는 상태 // CheckboxCell.swift var isCheck: Bool = false { didSet { let imageName = isCheck ? "checkmark.square" : "checkmark.square.fill" checkBoxButton.setImage(UIImage(systemName: imageName), for: .normal) } } cell이 check되는지 확인은 UITableViewCell에서 제공하는 setSelected(:animated:)를 override하여 사용 // CheckboxCell.swift..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cYWwII/btrc1eTtuQh/GA0rctpJXdE2iOXImwfwb0/img.png)
Hash란? hashing: 임의의 길이를 갖는 데이터(key)를 고정된 길이의 데이터(value)로 매핑하는 의미 hash function: key > value 매핑하는 함수 hash code: index값 hash value: hash code에 해당되는 value 값 collision(충돌) chaining으로 해결: hash function을 통해 얻은 hash code값에 이미 데이터가 존재하는 경우 > linked list를 통해 저장 LInear Probing으로 해결: hash code += 1 이동 Rehashing: Hash Table Hashable Hashing 기능 프로토콜 - 임의의 길이를 갖는 데이터(key)를 고정된 길이의 데이터(value)로 매핑 사용 Dictionary..