일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 클린 코드
- 리펙토링
- combine
- RxCocoa
- UICollectionView
- 리펙터링
- Protocol
- 스위프트
- uitableview
- Clean Code
- Human interface guide
- map
- Xcode
- ribs
- uiscrollview
- UITextView
- Observable
- collectionview
- SWIFT
- Refactoring
- clean architecture
- swiftUI
- MVVM
- swift documentation
- HIG
- 리팩토링
- ios
- 애니메이션
- rxswift
- Today
- Total
목록ios (1094)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/b5Nlcv/btsJPCItOvb/ajpKRKZyseCT1iOK9oF4B1/img.gif)
뷰 상태 관리상태가 변경되면 뷰가 업데이트 되는데 상태를 관리하는 방법은 크게 3가지ObservableObject 모델을 아래 3가지로 참고@StateObject (혹은@State), @ObservedObject, @EnvironmentObject)class Person: ObservableObject { @Published var name: String init(name: String) { self.name = name print("init > Person Model") }}struct Subview: View { @StateObject var personByState = Person(name: "jake") @ObservedObject var..
onAppear 호출 타이밍UIViewController의 viewWillAppear과 viewDidAppear 중간에 호출됨ViewController가 SwiftUI의 뷰를 가지고 있는 상태에서 각 print문을 넣어서 출력해보면, SwiftUI의 onAppear가 중간에 불리는 것을 확인viewWillAppearonAppear // 중간에 호출viewDidAppear코드)class ViewController: UIViewController { ... override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("viewWillAppear") } ov..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/H5cK5/btsJQbpNWnV/tXroprHQcwU8M0cNrquAjK/img.png)
UIScreenEdgePanGestureRecognizer 개념 edge pan이라는 이름에서도 볼 수 있듯이 아이폰의 가장장리 부분으로부터 안쪽으로 드래그하면 동작하는 제스쳐이 인스턴스의 프로퍼티 중 알아야 하는 것은 edgesedges: 드래그의 시작점 (top, left, bottom, right, all)let edgePanGesture = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(handleEdgePan(_:)))edgePanGesture.edges = .leftview.addGestureRecognizer(edgePanGesture)ex) edgePanGesture를 등록하여 왼쪽에서 오른쪽으로 드래그하면 뷰의 배경색상..
flag 관리하는 방법유사한 성격의 flag를 관리할때 보통 아래처럼 작성ex) 앱 유저 세팅에 관한 플래그를 관리하는 클래스class UserSettings { var isDarkModeEnabled: Bool var isNotificationsEnabled: Bool var isLocationServicesEnabled: Bool var isAutoUpdateEnabled: Bool var isPrivacyModeEnabled: Bool var isSoundEnabled: Bool var isVibrationEnabled: Bool var isEmailUpdatesEnabled: Bool var isTwoFactorAuthenticationEnabled..
OptionSet 개념OptionSet은 옵션이 있는 Set 자료구조이며, 옵션들을 마치 enum-case처럼 다룰 수 있고 set의 대표적인 연산자 insert, remove, contains, intersection 를 쓸 수 있는 자료구조ex) UserSetting에 관한 플래그를 관리하는 OptionSetstruct UserSettingsFlags: OptionSet { let rawValue: Int static let darkMode = UserSettingsFlags(rawValue: 1 OptionSet에서 rawValue를 bit로 표현하는 이유?일반적으로 OptionSete에서는 rawValue를 보면 모두 shift연산자를 통해 표현stat..
@StateObject, @EnvionrmentObject, @ObservedObject 구분모두 ObservableObject 타입의 모델을 프로퍼티로 선언할 때 사용class MyObject: ObservableObject { @Published var age = 0}struct ContentView: View { @StateObject var object1 = MyObject() @ObservedObject var object2 = MyObject() @EnvironmentObject var object3: MyObject var body: some View { }} 차이점?@StateObject: 이 프로퍼티는 오직 이것을 선언한 뷰 라이프 사이클에서만 관..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/VmsfX/btsJDUVQIyL/tCyicamV8iM8Dhjk6p5y11/img.png)
@StateObject 사용하다 보는 주의 메시지StateObject의 객체에 접근하다보면 가끔 뷰 install되기 전에 StateObject의 객체 접근하여 매번 새로운 인스턴스가 생성된다는 문구가 등장전체 코드는 아래와 같고, 이 원인 제공은 바로 @StateObject로 선언한 object의 값을 변경할 때 발생@mainstruct ExStateObjectApp: App { var contentView = ContentView() var body: some Scene { WindowGroup { contentView .onAppear { contentView.changeAge() ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/beV7WF/btsJDpvnoMF/tRSpL4heF7eJldJNBTtgX0/img.png)
네비게이션 블러 효과구현 아이디어먼저 navigationBar를 투명하게하고(isTranslucent = true), 색상을 clear로 설정네비게이션바에 addSubview하여 blur 뷰를 삽입blur뷰는 UIBlurEffect와 UIVisualEffectView를 사용하면 편하게 블러효과를 줄 수 있음구현 방법먼저 navigationBar를 투명하게하고(isTranslucent = true), 색상을 clear로 설정UINavigationBar.appearance().setBackgroundImage(UIImage(), for: UIBarMetrics.default)UINavigationBar.appearance().shadowImage = UIImage()UINavigationBar.appeara..