[ 목표 ] 이런 식으로 나만의 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] @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..
애플에서 예제로 보여준 Fruta 앱 처럼 macOS, iOS, and iPadOS에서 하나의 코드베이스로 다 동작하는 앱을 만들 수 있게 되었습니다. 👏 (iOS 14, XCode 12에서부터, SwiftUI를 이용해서) [1] Multi-platform 프로젝트 만들기 Xcode 12 베타버전을 열어주세요 새 프로젝트 만들기를 누르면 Multiplatform이라는 탭이 생겨있습니다. 거기서 App을 눌러주세요 프로젝트 이름을 입력해주고 프로젝트를 만들면 Shared, iOS, macOS 라는 그룹이 생겨져있습니다. 저는 test도 체크해서 저렇게 Tests iOS, Tests macOS라는 그룹도 생겼어요 그리고 iOS 또는 macOS로 돌려볼 수 있게 되어있어요 (mac OS는 빅서로 올려야지 돌리..
ZStack은 Stack안에 있는 자식 뷰들을 z축으로 중첩시켜주는 view 입니다. 실제 쓰이는 경우들을 알게 되어서 정리합니다-! [1] 카메라와 컨트롤 이런 카메라 앱을 만든다고 할때, 카메라뷰랑 컨트롤 버튼들(파란네모친 영역)를 zstack을 이용하여 동시에 띄울 수 있습니다. 더불어 컨트롤뷰의 HStack(갤러리 열기, 촬영, 필터 버튼들이 있음)를 bottom에서부터 height 200으로 위치잡아주고 싶다면 Spacer를 활용할수있습니다. (신기) [2] SwiftUI의 Fullscreen Modal을 띄울때 SwiftUI에서는 현재 fullscreen 모달을 띄울 수 있는 설정이 없습니다..😭 그래서 zstack을 활용해서 fullscreen presentation을 한 것 처럼 보이게 하..
viewController가 deinit 될때, 그 안의 Pulisher가 auto-cancel 되는지 실험해봅시다 --! 5초 후에 이벤트를 발행하는 Publisher와 3초 후에 deinit되는 viewController가 있습니다 1) stream을 안담아줄 때 viewController가 deinit되어도 스트림이 살아있습니다 2) stream을 Cancellable에 담아줄 때 viewController가 deinit되어도 여전히 스트림이 살아있습니다 3) stream을 Cancellable에 담아주고 deinit 때 cancel 시켜줄 때 이렇게 deinit 될때 cancel시키는 코드를 넣어줘야지 스트림이 같이 끝납니다 4) stream을 AnyCancellable에 담아줄 때 AnyCanc..
이 포스팅을 이해하려면 RxSwift vs Combine - 스펙 / 성능 / 개념 비교를 읽고 오세요 ☺️ Rxcocoa(for UIKit) + RxSwift 로 짰던 코드를 -> UIKit + Combine -> SwiftUI + Combine 이렇게 두 가지 버전으로 바꿔보았습니다 :) 우선 Model/ViewModel 쪽 코드는 큰 차이가 없었습니다 APIManager 안에 있는 fetch 함수를 예로 봅시다 (isbn number를 받아서 책정보를 주는 함수입니다) Observalbe을 AnyPulisher로 바꾸면 끝입니다 그 다음 APIMananger의 fetch 함수를 부르는 ViewModel 쪽 코드를 봅시다 여기도 subscribe를 sink로 바꿔주면 끝입니다 하지만 UIBinding..
WWDC 2019에서 Combine이 발표되었다. Combine은 Rx와 똑같다! 라고 말하던데 정말 똑같을까..? 🤔 Rx와 Combine을 비교해보자 1. 스펙 비교 Rx와 Combine은 모두 Reactive 프로그래밍을 위한 framework이다 하지만 Rx는 iOS 8이상부터, Combine은 iOS 13이상부터 사용할 수 있다 (그래서 Combine을 실제 프로덕트에서 쓰기까지는 최소 1년에서 최대 3년까지 걸릴 것이라고 말한다) Rx는 Third party framework인 반면 Combine은 애플에서 만든 buit-in framework이다...! 그리고 Rx는 Rxcocoa와 Combine은 SwiftUI와 UIBinding을 하도록 설계되어졌다 (하지만 Combine은 SwitUI와..
- Total
- Today
- Yesterday
- Django FCM
- Django Firebase Cloud Messaging
- flutter dynamic link
- Flutter 로딩
- github actions
- Dart Factory
- Python Type Hint
- drf custom error
- 플러터 얼럿
- 장고 URL querystring
- cocoapod
- flutter 앱 출시
- PencilKit
- 구글 Geocoding API
- DRF APIException
- ipad multitasking
- flutter build mode
- SerializerMethodField
- Flutter Clipboard
- Watch App for iOS App vs Watch App
- 장고 Custom Management Command
- Django Heroku Scheduler
- Flutter Text Gradient
- 플러터 싱글톤
- Flutter getter setter
- Flutter Spacer
- flutter deep link
- METAL
- ribs
- 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 | 31 |