일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- MVVM
- Xcode
- uiscrollview
- 스위프트
- UICollectionView
- ios
- 리펙토링
- clean architecture
- Clean Code
- map
- collectionview
- HIG
- 클린 코드
- Refactoring
- SWIFT
- rxswift
- 리팩토링
- Protocol
- UITextView
- 애니메이션
- 리펙터링
- RxCocoa
- swiftUI
- ribs
- combine
- tableView
- uitableview
- Human interface guide
- swift documentation
- Observable
- Today
- Total
목록iOS 튜토리얼 (SwiftUI) (23)
김종권의 iOS 앱 개발 알아가기
* 애플워치 타겟 추가 방법은 이전 포스팅 글 먼저 참고 애플워치 앱 뷰 만들기 iOS전용으로 만들었던 뷰 LandmarkList에서 셀을 누르면 LandmarkDetail로 이동하는데, 이때 애플워치에서 동일한 파일 이름LandmarkDetail으로 구현할 경우, 애플 워치를 실행했을때 iOS의 LandmarkDetail이 아닌 애플워치가 동작 ex) 애플워치 ContentView에 iOS 전용으로 구현한 LandmarkList를 사용하고, iOS 전용으로 구현한 LandmarkDetail.swift와 동일한 이름으로 애플워치 폴더 하위에 파일을 만들어 실행 -> LandmarkList는 애플워치에서 구현한게 아니므로 iOS에서 만든 뷰로 동작하고, LandmarkDetail는 애플워치 하위에 동일한 ..
* 아래 프로젝트 시작 파일은 애플 튜토리얼에서 다운 기존 iOS앱에 애플 워치 앱 타겟 생성 Xcode > File > New > Target... 선택 WatchOS > Watch App for iOS App 선택 Include Notification Scene 체크하여 생성 Scheme을 활성화 할것이라는 팝업에서 cancel 선택 Cancel을 선택해도, Scheme > WatchLandsmarks를 선택하여 워치앱을 빌드가 가능 생성된 파일 확인 WatchLandmarks 폴더 - 리소스가 위치 WatchLandmarks WatchKit Extension 폴더 - 애플워치에 사용되는 화면들이 위치 Target > ... WatchKit Extension > Supports Running Wi..
SwiftUI에서 UIkit 사용 방법 - UIView UIViewRepresentable 프로토콜을 구현하면 SwiftUI에서 UIView 사용 가능 @available(iOS 13.0, tvOS 13.0, *) @available(macOS, unavailable) @available(watchOS, unavailable) public protocol UIViewRepresentable : View where Self.Body == Never { associatedtype UIViewType : UIView func makeUIView(context: Self.Context) -> Self.UIViewType func updateUIView(_ uiView: Self.UIViewType, contex..
EnvironmentValues superview에서 darkmode로 설정하면 subviews들도 모두 darkmode로 변할 수 있는 기능을 EnvironmentValues로 제어가 가능 Swift에서는 개별 클래스로 관리하였지만, SwiftUI에서는 모두 Environment를 통해서 모두 접근이 가능 가장 대표적인 값은, 지금 지역을 알 수 있는 locale과 layoutDirection, undoManager 등 접근 가능 ex) superview에서 `colorScheme`값을 dark로 지정하면 subview들은 자동으로 dark mode로 변경 EnvironmentValues 종류 editMode colorScheme timeZone locale calendar layoutDirection..
toolbar TabBar와의 차이점 TabBar: 현재 컨텍스트와 연관되지 않은 화면이동 ToolBar: 현재 컨텍스트와 관련된 항목 추가, 삭제, 주석 추가, 사진 촬영과 같은 일 * toolbar의 Human Interface guide 관련 구체적인 내용은 이전 포스팅 글 참고 toolbar를 사용하기 위해 네비게이션 뷰로 이루어진 뷰 준비 import SwiftUI struct ContentView: View { var body: some View { NavigationView { VStack { Text("Toolbar 예제") .padding() } .navigationTitle("타이틀") } } } toolbar를 추가할땐 navigationTitle을 추가하듯이 바로 밑에다 .toolb..
@State View를 상속받는 뷰에서, 값을 변경할때 사용하는 프로퍼티 어노테이션 @State var n = 0 내부 구현부는 propertyWrapper를 사용한 형태 ex) @State를 붙이지 않은 경우 컴파일 에러 발생 struct ContentView: View { var n = 0 var body: some View { VStack { Text("\(n)") Button("Tap!!") { n += 1 // Error: Left side of mutating operator isn't mutable: 'self' is immutable } } } } ex) @State를 프로퍼티 앞에 붙일 경우 컴파일 에러 해결 struct ContentView: View { @State var n = 0 //
* 전체 소스 코드는 튜토리얼에 있는 프로젝트 참고 TabView TabView와 .tabItem 속성을 이용하여 구현 먼저 Tab의 케이스를 정의하고, 이 케이스를 상태로 갖고있는 프로퍼티도 선언 import SwiftUI struct ExampleView: View { @State private var selection = Tab.home enum Tab { case home case setting } } body를 선언하여 내부에서 TabView(selection:)으로 selection 상태를 정의하고 클로저 내부에서 TabView안에 들어갈 뷰들을 구현 var body: some View { TabView(selection: $selection) { // 여기서 뷰 구현 } } 첫 번째 뷰 - ..
GeometryReader ContainerView이며, 내부에 UIView들의 layout을 쉽게 변경할 수 있는 역할 * GeometryReader를 안쓴 경우) Stack안에 두가지의 뷰가 들어가고, Rectangle이 하단의 모든 자리를 차지하는 형태 struct Example: View { var body: some View { VStack { Text("example GeoMetryReader") Rectangle() .foregroundColor(.green) } } } struct Example_Previews: PreviewProvider { static var previews: some View { Example() } } GeometryReader를 사용한 경우) GeometryRe..