iOS13부터 멀티 윈도우가 가능해지면서 UI Structure에 UIWindowScene이라는 개념이 등장했습니다. UISceneSession이라는 개념도 함께요..!! 그럼 UIScene, UIWindowScene, UISceneSession에 대해 간단히 살펴보겠습니다 [1] UIScene - 앱 UI의 하나의 instance 또는 복사본을 의미합니다. - 아래와 같은 상황에서는 세개의 scene이 있다 라고 말할 수 있습니다. - 특정한 session과 connection 정보들로 Scene을 만듭니다. - UISceneDelegate를 이용하여 Scene의 life-cycle events을 매니징할 수 있습니다. UISceneDelegate에는 아래와 같은 라이프사이클 관련 함수들이 있습니다. ..
[1] Consider size & size class instead of orientation portrait모드일때는 왼쪽 레이아웃, landscape모드일때는 오른쪽 레이아웃으로 나오게 해놨다고 합시다. 그럼 아래와 같이 아이패드 landscape 모드에서 split view를 띄우면 landscape일때의 레이아웃으로 나오겠죠...!!! 노우..!!! 우리가 원하는 것인 이런 레이아웃 인데 말입니다ㅠㅠ 그래서 orientation으로 분기하지 말고 Bounds 또는 Size Class로 분기하라고 하네요 [2] Think about how to respond to transition rotation & resizing 상태에 대해 인지하고 UI를 바꾸고 싶다면 아래의 함수들을 이용할 수 있습니다...
iOS 9부터 아이패드 멀티태스킹이 지원되었다고 합니다. slide over 또는 split view로 두가지 앱을 동시에 띄울 수 있는 것이죠! 관련 WWDC 영상으로는 Getting Started with Multitasking on iPad in iOS 9 가 있습니다. ⚠️ 멀티태스킹과 멀티 윈도우는 다릅니다...!! ⚠️ 멀티 윈도우는 iOS 13부터 지원가능한데, 멀티태스킹 처럼 서로 다른 두 앱을 각각 띄우는 것 뿐만 아니라 똑같은 앱을 두개 띄울 수 있는 것 까지 포함합니다. 메모앱을 두개 띄우고 텍스트를 입력하는 영상입니다. 멀티 윈도우 관련 WWDC 영상으로는 Introducing Multiple Windows on iPad 가 있습니다. [1] 멀티 태스킹 지원하는 방법 iOS 9 이..
옵져버블이 completed되고 난 후, 마지막 값을 테스트로 확인해보고 싶은 경우가 있다고 해보겠습니다. 이런 테스트 코드가 있습니다. 당연히 테스트가 실패하겠죠..?! RxBlocking을 쓰면 이 테스트는 성공합니다..!! toBlocking함수를 쓰면 Observable -> BlockingObservable로 바뀌고 BlockingObservable의 last함수는 시퀀스가 종료될때 까지 블러킹해주는 역할을 하기 때문이죠....!! (Blocks current thread until sequence terminates.) 그럼 BlockingObservable의 함수 몇가지를 더 알아보겠습니다. [1] first() 시퀀스의 첫번째 이벤트가 방출될때 까지 블러킹해줍니다. (Blocks curre..
1. 문제 폰트 파일을 프로젝트에 넣고 폰트 파일의 Target Membership 설정도 했으며 Info.plist 에서 추가해야하는 key, value 값도 추가했다. 하지만 이렇게 했을 때, 커스텀 폰트가 텍스트에 적용이 안되었다. 2. 해결방안 SceneDelegate > scene(_ scene: UIScene, willConnectTo…) method 에 아래의 코드를 추가해서 돌려보았다. for fontFamily in UIFont.familyNames { for fontName in UIFont.fontNames(forFamilyName: fontFamily) { print(fontName) } } 콘솔에서 Nanum을 검색하면 폰트네임이 NanumSquareR 로 들어가있다. 이렇게 폰트..
[1] NSManagedObjectContext를 여러개 사용하는 경우 보통 앱에서 하나의 managed object context를 사용합니다. (우리가 자주 쓰는 persistentContainer.viewContext) 하지만 여러개의 managed object context를 사용해야할 상황이 있습니다. 시간이 오래걸리는 작업을 viewContext에서 하면 메인쓰레드가 blocking 되는 상황에서요! 여러개의 managed object context를 사용할 때 유의할 점이 있습니다. Managed Object context A와 Managed Object Context B 가 있다고 가정해볼게요. 그리고 두개의 context에서 모두 persistent store에 저장되어있는 User 정보..
1. 문제 뷰컨트롤러에 텍스트 뷰를 올려주세요. 그리고 앱이 launch 된 지 5분후에 만개의 데이터를 만들고 저장하는 코어 데이터 연산을 해보겠습니다. CoreDataManager는 이렇게 구성되어있습니다. 그러면 텍스트를 타이핑하다가 5초 후에 CoreData 연산이 시작되면 아무리 타이핑을 입력해도 입력이 안됩니다. UI 담당인 메인 쓰레드가 blocking 되었기 때문이죠! CoreData 연산이 끝나면 다시 타이핑이 가능해집니다. 그 이유는 무엇일까요...?!?!?! 우리가 사용한 viewContext가 main queue에서 동작하는 친구이기 때문입니다!! 그래서 시간이 오래 걸리는 작업이라면, viewContext 를 사용하면 안됩니다. 사용자의 화면을 blocking 하기 때문이죠!!! ..
TextKit 관련 wwdc영상인 TextKit Best Practices 를 보다가 TextKit 구조(?)를 한장으로 정리하였다. Reference https://developer.apple.com/videos/play/wwdc2018/221/ TextKit Best Practices - WWDC 2018 - Videos - Apple Developer Leverage the abilities of TextKit to provide the best experience possible displaying and editing text. Get the best performance out of... developer.apple.com
ReactorKit문서 를 보면 transform 함수에 대한 설명이 있습니다. transform은 mutate나 reduce 함수처럼 Reactor에 반드시 구현해야하는 함수가 아닙니다. 그래서 저는 최근에 알았는데, 까먹지 않게 정리해두려고 합니다. Transform transform 관련 함수는 이렇게 세개가 있습니다. 이 함수들을 구현하여서 다른 observable stream들과 결합(combine) 할 수 있다고 합니다. 특히 transform(mutation:) 함수가 global event stream를 mutation stream과 결합하는 경우에 많이 쓰인다고 합니다. 잘 안와닿으니 더 구체적으로 살펴보겠습니다...!! 그러기 위해서 우선 Global State에 대해서 알아야합니다. ..
https://www.test.com/users?gender=male&age=20&job=designer 위와 같은 get 요청에서 gender=male age=20 job=designer 같은 파라미터를 구하려면 어떻게 해야할까요?!? 저는 정규표현식을 이용했습니다. Swift에서 정규표현식(Regular Expression)을 이용하기 포스팅에 차마 이어쓰지 못하겠어서(😱) 새롭게 씁니다. 하지만 자세한 설명은 저기에 있습니다. 여기에는 간략하게! 결론 이렇게 extension을 추가하고 정규표현식 패턴으로 아래의 것을 쓰면 됩니다. [^&?]+=[^&?]+ 테스트를 돌리면 성공하는 것을 볼 수 있습니다. 과정 저렇게 테스트가 성공할 수 있는 과정을 살펴보겠습니다. 우선 [^?&] 이거 부터 살펴보자..
- Total
- Today
- Yesterday
- 플러터 싱글톤
- 장고 Custom Management Command
- METAL
- Flutter Text Gradient
- 플러터 얼럿
- Sketch 누끼
- 구글 Geocoding API
- Django FCM
- Django Heroku Scheduler
- Flutter getter setter
- cocoapod
- Python Type Hint
- 장고 URL querystring
- SerializerMethodField
- Dart Factory
- PencilKit
- drf custom error
- ribs
- Flutter 로딩
- Flutter Spacer
- github actions
- DRF APIException
- Watch App for iOS App vs Watch App
- flutter dynamic link
- ipad multitasking
- Flutter Clipboard
- flutter build mode
- flutter 앱 출시
- Django Firebase Cloud Messaging
- flutter deep link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |