WWDC 2021 > SwiftUI Accessibility: Beyond the basics 를 보던 중, iOS15에 새로 나온 accessibilityRepresentation(representation:) 을 찾아보면서 좋은 예제를 발견해서 정리합니다. 출처는 The power of accessibilityRepresentation view modifier in SwiftUI 글 입니다. [1] accessibilityRepresentation(representation:) 길게 눌렀을 때만 체크상태를 토글하는 LongPressCheckmark라는 커스텀 뷰를 만들었다고 해봅시다. import SwiftUI struct LongPressCheckmark: View { @Binding var isS..
[ 이슈 ] Deployment Target이 iOS 13인 앱에서 value change를 감지하기 위해 onChange(of:perform:) 를 사용하려고 했으나 onChange는 iOS 14부터 지원되는 것이였습니다,,, 애플의 Picker 를 예제로 대응책을 살펴보겠습니다! 방법 1 ) onReceive(_:perform:) 는 iOS 13부터 가능하므로 이것을 써준다. onReceive에 Publisher 타입을 넘겨줘야하므로 Just 로 감싸줘야하는데, 이를 위해 import Combine 해줘야합니다. import SwiftUI import Combine enum Flavor: String, CaseIterable, Identifiable { case chocolate case vanill..
Managing Model Data in Your App 문서를 보면 App의 모델 데이터와 뷰 간의 connection을 만들어 주는 세가지 property wrapper type 을 소개해줍니다. - ObservedObject iOS 13+ - EnvironmentObject iOS 13+ - StateObject iOS 14+ ObservedObject 랑 EnvironmentObject는 작년에 살펴봐서 안살펴본 StateObject 만 정리해보겠습니다. StateObject 의 정의 A property wrapper type that instantiates an observable object. StateObject 왜 필요한가? (Managing Model Data in Your App 문서 ..
enum Type { case A case B } struct AView: View { var body: some View { EmptyView() } } struct BView: View { var body: some View { EmptyView() } } # single return type 이렇게 각 타입에 맞게 다른 뷰를 리턴해주면 컴파일 에러가 난다. Swift는 function에 대해 single return type을 요구하기 때문이다. # AnyView , Group 그래서 AnyView로 감싸서 쓴다. 참고로 AnyView는 return을 생략하고 쓸 수는 없다. 또는 Group을 이용하는 방법도 있다. # @ViewBuilder WWDC 2021 - Demystify SwiftUI 에..
ZStack 은 자신의 children를 z축으로 overlay하는 View이고 overlay 는 현재 뷰에 secondary view를 overlay하는 modifier 입니다. (overlay를 중첩으로 번역할 수 있을 것 같습니다) 애플문서에 있는 overlay 예제의 결과를 zstack으로도 똑같이 나타낼 수 있습니다. 이렇게 보면 똑같아보이지만 사실 두 개는 차이점이 있습니다. ZStack의 자식뷰들은 서로에 대해 independent 합니다. 그리고 ZStack에 frame을 따로 주지 않은 이상 가장 큰 자식뷰를 기준으로 ZStack의 fit이 결정됩니다. 반면 overlay의 경우 overlay되는 view는 parent view에 종속됩니다. 항상 overlaid view는 parent ..
[ 목표 ] 이런 식으로 나만의 Modifier를 만들기! Text("안녕하세요") .customStyle() [1] Custom ViewModifier 만들기 ViewModifier 프로토콜을 채택하는 CustomViewModifer를 만들어줍니다. content는 스타일을 적용시킬 대상을 말합니다. ViewModifier를 만들면 이런 식으로 modifier 를 이용해서 사용할 수 있습니다. [2] extension View 그 후, 아래처럼 View를 extension하면 나만의 Modifier를 만들 수 있습니다. 참고로 문서에서는 1번처럼 modifier를 직접 쓸 수도 있지만 2번처럼 extension 해주는게 더 common하다! 라고 말하고 있습니다. [ 추가 ] 이런식으로 color을 받..
Button은 딱 텍스트영역만 Tappable 하다. (노란색은 클릭영역이 아님) 이미지를 넣어도 마찬가지로 딱 이미지 영역만 Tappable하다. (노란색은 클릭영역이 아님) UIKit과 달리 SwiftUI에서는 버튼을 만들기 위해서 Label이라고 불리는 다른 뷰를 꼭 줘야한다.그래서 Label 영역만 tappable하게 디자인되었나보다. (추측) 그러면 Label말고 다른 영역도 Tappable하게 하려면 어떻게 해야할까?! [1] Button말고 Label에 frame을 주기 Label영역만 Tappable하니까 Label영역을 버튼사이즈로 해주면 되는 방법이다. [2] 버튼 아닌 뷰를 만든 후, onTapGesture 사용SwiftUI의 버튼이 Label 영역만 Tappable하게 디자인 되었다..
첫번째 사진의 modifier 순서는 background -> frame 입니다. 두번째 사진의 modifier 순서는 frame -> background 입니다. 결과가 다른 것을 볼 수있죠?! 그 이유는 무엇일까요-?! SwiftUI에서는 View에 modifier를 적용할때마다 새로운 view를 만들게 되는 것임을 기억해야합니다 (단지 존재하는 view의 속성을 바꾸는 게 아니라 새로운 view를 리턴하게 되는 것-!) 그래서 첫번째 사진은 아래와 같은 이유로 저렇게 그려졌고 두번째 사진은 아래와 같은 이유로 저렇게 그려졌습니다. 헷갈리지 않도록 frame modifier를 첫번째로 위치시켜야겠습니다...! 그리고 개발하면서 frame말고도 순서바꾸니까 원하는대로 동작했던 것이 또 있었는데 (잘 기..
Future는 Publisher 프로토콜 을 conform하고 있다. Swift에서 asynchronous 프로그래밍을 위해 callback기반 completion handler를 사용했는데, (Rx안쓴다면) 이제 Future를 사용하면 된다..! Future는 말그대로 아직 일어나지 않은 미래를 의미한다(??) Future는 Output과 Error를 가지고 있고 (Publisher를 conform하니까 당연쓰) final public class Future : Publisher where Failure : Error Promise 클로져가 있는데, Promise 클로져는 이렇게 생겼다. [1] 기본 사용법 let future = Future { promise in promise(.success(1))..
[1] @State 이니셜라이저에서 state를 초기화해주려면 underscore를 써서 접근해야한다. (출처) struct SomeView: View { @State var selectedIndex: Int init() { let selectedInde = // do something _selectedIndex = State(initialValue: selectedIndex) } var body: some View { ... } } [2] @Binding 바인딩도 마친가지이다. 이니셜라이저에서는 underscore를 써서 접근해야한다 struct SomeView: View { @Binding var someValue: Int init(someValue: Binding) { _someValue = som..
- Total
- Today
- Yesterday
- Django Firebase Cloud Messaging
- Flutter Clipboard
- 장고 Custom Management Command
- SerializerMethodField
- flutter build mode
- METAL
- ipad multitasking
- 플러터 얼럿
- 구글 Geocoding API
- Dart Factory
- DRF APIException
- Flutter Text Gradient
- Watch App for iOS App vs Watch App
- Flutter 로딩
- 장고 URL querystring
- github actions
- 플러터 싱글톤
- Flutter Spacer
- Django FCM
- Python Type Hint
- Flutter getter setter
- Django Heroku Scheduler
- cocoapod
- drf custom error
- flutter deep link
- PencilKit
- ribs
- flutter dynamic link
- flutter 앱 출시
- Sketch 누끼
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |