일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
- Clean Code
- Protocol
- collectionview
- 클린 코드
- 리펙터링
- RxCocoa
- ribs
- UICollectionView
- swiftUI
- clean architecture
- tableView
- Observable
- uitableview
- ios
- UITextView
- Xcode
- swift documentation
- combine
- uiscrollview
- rxswift
- SWIFT
- MVVM
- 애니메이션
- HIG
- map
- Refactoring
- Human interface guide
- 리팩토링
- 스위프트
- 리펙토링
- Today
- Total
목록분류 전체보기 (1641)
김종권의 iOS 앱 개발 알아가기
convert(_:to:) 메소드 UIView의 확장으로 정의 인수로 입력한 view를 기준으로 point의 좌표를 구하는 것 중요한 팁) view에 nil을 전달하면 window를 기준으로 상대좌표를 구하므로, 절대좌표 획득이 가능 상대좌표 예시 뷰 3개를 겹쳐놓고 각 뷰의 상대좌표를 출력해보는 예시 빨강 - 초록 - 파랑을 순서대로 aView, bView, cView라고 정의 크기가 정해진 타이밍 viewDidAppear에서 비교 override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("== original frame ==") print("aView = ", aView.frame) print("bView =..
ViewAppear 이벤트 아이디어 UIViewController는 viewWillAppear와 같은 뷰컨트롤러가 보이기 직전에 델리게이트 메소드가 있지만, UIView는 존재 x UIView에서 viewAppear와 같은 메소드가 있다면, 특정 뷰가 등장했을때 파악이 가능 등장했을때 해당 뷰의 frame값을 구하여, 이 뷰와 현재 화면의 bounds를 intersects하여 구하면 쉽게 파악이 가능 * intersects: 인자로 들어온 rect값에 호출한 instance의 bounds가 겹치는지 파악할때 사용하는 메소드 CGRect의 확장으로 정의된 함수 extension CGRect { public func intersects(_ rect2: CGRect) -> Bool } viewAppear구현 ..
하단 로딩 구현 아이디어1단계) Pagination: tableView의 willDisplay 델리게이트에서 마지막 인덱스 값인지 체크하고, 마지막 인덱스 값이면 페이지네이션 구현2단계) 하단로딩: willDisplay에서 페이지네이션이 되기 전에 tableView의 footerView에 indicator가 있는 UITableViewHeaderFooterView를 대입해주고, 데이터가 들어오면 다시 footerView.tableFooterView를 nil로 초기화하단 로딩 구현pagination 형태 구현class ViewController: UIViewController { private let tableView: UITableView = { let view = UITableView(..
contentInsetAdjustmentBehavior 속성 safeArea를 고려하여 자동으로 레이아웃을 지정해주도록 하는 옵션 구체적으로는 scrollView의 content 영역의 inset을 safe area 고려하여 레이아웃될지 결정해주는 옵션 ContentInsetAdjustmentBehavior의 4가지 옵션 automatic(default): 자동으로 safe area에 맞게 레이아웃 조정 scrollableAxes: 스크롤 가능한 방향만 safe area 고려 never: safe area 상관 없이 적용 always: content는 무조건 safe area 고려 @available(iOS 11.0, *) public enum ContentInsetAdjustmentBehavior : ..
UITableView의 backgroundView 프로퍼티 보통 리스트 형태나 그리드 형태로 데이터를 보여줄 때, 데이터를 불러오기 전에 스켈레톤 뷰 같은것을 보여주어야 하는데 이 때 UITalbeView나 UICollectionView 내부에 있는 backgroundView 프로퍼티를 사용하면 매우 쉽게 적용이 가능 (별도의 뷰 필요 없이 tableView.backgroundView 사용) 이 backgroundView는 tableView의 cell 앞쪽에 위치 ex) tableView에 사용할 cell 정의 final class MyTableViewCell: UITableViewCell { static let id = "MyTableViewCell" private let label = { let la..
UITextChecker 개념 교정기능을 제공하는 클래스 오타 검사 자동완성 및 제안 기능 UITextChecker 오타 검사 오타가 있는 mountein 문자열 준비 (mountain으로 잘 교정되는지 확인을 위함) let str = "mountein" UITextChecker 인스턴스 생성 let textChecker = UITextChecker() rangeOfMisspelledWord(in:range:startingAt:wrap:language:) 메소드를 사용 language 값에는 언어코드가 들어가는데, 이 언어코드는 iSO 639-1가 사용 ex) 영어면 en_US, 한국어면 ko ISO 639-1 언어코드표 이 언어코드는 Locale로 접근하여 획득도 가능 Locale.current.ide..
private 프로퍼티 접근 아이디어 Mirror를 통해 property의 문자열 이름을 통해 접근 Mirror란? 인스턴스의 *display style과 하위 정보를 표현하는 구조체 * display style: struct인지, class인지, enum인지 구분을 위한 값 Mirror는 특정 인스턴스의 타입, 그 인스턴스의 하위 값(인스턴스, 메소드 등)의 정보를 가지고 있는 것 구체적인 개념은 이전 포스팅 글 참고 Mirror로 private 프로퍼티 접근하기 예제 코드 준비 외부에서 SomeClass의 private 프로퍼티인 name에 접근하는게 목적 아래처럼 private 키워드를 사용하면 사용하는쪽에서 접근이 불가능 import UIKit class SomeClass { private var..
PropertyWrapper를 이용한 로깅 * propertyWrapper 개념은 이전 포스팅 글 참고 propertyWrapper를 이용하면 사용하는쪽에서는 일반 property처럼 사용할 수 있지만, 내부적으로 wrapping하여 프로퍼티가 get되거나 set될때 다양한 처리가 가능 set될때 로깅 스택에 쌓아놓는 방향으로하면 사용하는쪽에서는 단순히 프로퍼티에 값만 변경해주어도 자동으로 로깅되므로 쉽게 사용이 가능 propertyWrapper로 로깅하는 구조 기본적인 propertyWrapper 정의 @propertyWrapper struct HistoryProperty { var _wrappedValue: T var wrappedValue: T { get { _wrappedValue } set { ..