일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- rxswift
- uiscrollview
- tableView
- ribs
- Refactoring
- 리펙터링
- UITextView
- Observable
- ios
- swiftUI
- Xcode
- 애니메이션
- Human interface guide
- UICollectionView
- combine
- HIG
- 리펙토링
- SWIFT
- 스위프트
- clean architecture
- Protocol
- RxCocoa
- swift documentation
- MVVM
- 클린 코드
- Clean Code
- uitableview
- 리팩토링
- collectionview
- map
- Today
- Total
목록분류 전체보기 (1640)
김종권의 iOS 앱 개발 알아가기
deprecated될 UIScreen.main.bounds.width 스크린 width를 구할 때 예전에는 보통 UIScreen.main.bounds를 사용 이때 UIScreen.main을 사용하려는 시점에 애플에서 경고 메시지가 노출 'main' will be deprecated in a future version of iOS: Use a UIScreen instance found through context instead: i.e, view.window.windowScene.screen 여기서 사용하라고 애플에서 권장하는 것은 view.window.windowScene.screen 라는 프로퍼티 애플에서 권장하는 view.window.windowScene.screen 이 프로퍼티는 아래처럼 접근이 가..
statusBarManager 개념 기존에 statusBar의 heigth를 구하려고 하면, statusBarFrame 이라는 기존에 있던 프로퍼티가 iOS13에서 deprecated되었다는 경고 메시지가 노출 UIApplication.shared.statusBarFrame.height 애플은 iOS13+에서 statusBar에 대한 값을 관리하는 별도의 statusBarManager를 정의 UIStatusBarManager는 class 타입 3가지의 프로퍼티가 존재 여기서 statusBarFrame을 사용하면 height구하기도 가능 statusBarManager 사용법 UIWindowScene의 instance이므로, UIWindowScnene인스턴스를 가져와서 획득 if let windowScene..
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>>") } } 이 애니메이션은 사용자가 직접..
특정 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..
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) ->..
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...
1. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - 단순 텍스트 2. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - UTF16 (이모지를 고려한 처리) 3. 붙여넣기 글자 제한 UITextView 처리, 커서 이동 처리 방법 - isScrollEnabled=false인 상태에서 커서 위치로 스크롤링 방법(#caretRect(for:), #scrollToCursor) UITextView에서 cursor 영역으로 스크롤 이동시키는 방법 보통 UITextView의 isScrollEnabled = true로 하고 붙여넣기하면 해당 커서로 자동으로 스크롤 되지만, isScrollEnabled = false로 하고 외부 스크롤 뷰를 사용할 땐 외부 스크롤 뷰를 cu..
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 =..