일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 애니메이션
- uitableview
- RxCocoa
- HIG
- MVVM
- tableView
- combine
- Human interface guide
- 클린 코드
- Xcode
- Observable
- 리펙토링
- ios
- Protocol
- 리팩토링
- rxswift
- Refactoring
- UICollectionView
- swiftUI
- swift documentation
- 리펙터링
- SWIFT
- map
- UITextView
- Clean Code
- 스위프트
- uiscrollview
- clean architecture
- ribs
- collectionview
- Today
- Total
목록ios (1095)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bDQEz6/btsyHYAMj9E/KM9FN1Qko233pzsHiFUwC1/img.png)
setContentOffset의 completion setContentOffset(_:animated:) 메소드에서는 completion이 존재 x class UIScrollView { open func setContentOffset(_ contentOffset: CGPoint, animated: Bool) } UIScrollViewDelegate의 scrollViewDidEndScrollingAnimation을 사용하여 구현 extension ViewController: UIScrollViewDelegate { func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) { // print("end>>") } } 이 애니메이션은 사용자가 직접..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/zuUYF/btsyDL9wWvT/eWtv9cGQhFp5iZz8JzkEl0/img.png)
특정 rect 영역이 포함되는지 확인 방법 진한 회색뷰이 얕은 회색뷰에 완전히 포함되는지 확인하는 방법? 오렌지색 뷰가 회색뷰에 걸쳐있는지 확인하는 방법? contains(_:) 완전히 포함되었는지 확인이 가능 extension CGRect { public func contains(_ rect2: CGRect) -> Bool } 두 개가 걸쳐져 있는지 확인 가능 extension CGRect { public func intersects(_ rect2: CGRect) -> Bool } 아래처럼 사용 containerView.frame.intersects(orangeView.frame) // true containerView.frame.contains(orangeView.frame) // false cont..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/dQBjRV/btsyuJX1tF8/6f341z9hRbHtZknh2EcMc0/img.png)
Non-nominal type 개념 Any를 확장하기 위해서 extension Any를 하게되면은 Non-nominal type이라는 컴파일 에러가 발생 Non-nominal type이란 swift 내부적으로 struct, enum, class, protocol로 정의하지 않은 타입을 의미 Array, Int, Double과 같은 타입들은 extension이 가능한데, 이것들은 Swift내부적으로 struct로 구현되어 있기 때문 Optional도 마찬가지로 enum으로 정의되어 있기 때문에 extension이 가능 ex) Double은 내부적으로 struct로 구현되어 있음 @frozen public struct Double { ... } Non-nominal type 예시 함수 형태: (Int) ->..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cr7VSx/btsyt0FX4UF/K0Z5R79OL1PjwOH3rqkr0K/img.gif)
KVO 개념 Key Value Observing: key는 인스턴스의 proprety를 의미하며 이 proprety가 변경되는 것을 인스턴스의 프로퍼티(속성)에 대한 변화를 감시하고, 해당 변화에 대한 알림을 받는 디자인 패턴 및 기술 KVO 간단 사용법 ex) KVO를 사용하여 버튼이 highlighted 되는 이벤트를 구독하여 count올려주는 예제 뷰 준비 class ViewController: UIViewController { private let label = { let label = UILabel() label.text = "count: 0" label.font = .systemFont(ofSize: 24, weight: .regular) label.numberOfLines = 0 label...
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bnD1ON/btsymEbvqMO/PkH1nDtphK4F5vhiGvRgU0/img.gif)
1. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - 단순 텍스트 2. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - UTF16 (이모지를 고려한 처리) 3. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - isScrollEnabled=false인 상태에서 커서 위치로 스크롤링 방법(#caretRect(for:), #scrollToCursor) UITextView에서 cursor 영역으로 스크롤 이동시키는 방법 보통 UITextView의 isScrollEnabled = true로 하고 붙여넣기하면 해당 커서로 자동으로 스크롤 되지만, isScrollEnabled = false로 하고 외부 스크롤 뷰를 사용할 땐 외부 스크롤 뷰를 cu..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bImOrL/btsxH0ABYrV/ZirTfYmBDg8svYc0J6BJi1/img.png)
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 =..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/XTzAz/btsxzYwrBRn/DSJKaL1c6EfMqly0dKWlyk/img.gif)
ViewAppear 이벤트 아이디어 UIViewController는 viewWillAppear와 같은 뷰컨트롤러가 보이기 직전에 델리게이트 메소드가 있지만, UIView는 존재 x UIView에서 viewAppear와 같은 메소드가 있다면, 특정 뷰가 등장했을때 파악이 가능 등장했을때 해당 뷰의 frame값을 구하여, 이 뷰와 현재 화면의 bounds를 intersects하여 구하면 쉽게 파악이 가능 * intersects: 인자로 들어온 rect값에 호출한 instance의 bounds가 겹치는지 파악할때 사용하는 메소드 CGRect의 확장으로 정의된 함수 extension CGRect { public func intersects(_ rect2: CGRect) -> Bool } viewAppear구현 ..
![](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(..