☑️ dynamic-callable 간단 설명 @dynamicCallable 은 객체가 함수처럼 동작할 수 있도록 만들어준다. 쉽게 말하면, 해당 객체에 대해 함수 호출 연산자 ()를 사용할 수 있게 해준다. 이를 통해 동적으로 호출되는 동작을 구현할 수 있다. 어떤 객체의 호출을 일반화하거나, 다양한 유형의 인자를 처리하는 등의 상황에서 유용하다. [1] 수학연산 @dynamicCallable struct DynamicMultiplier { func dynamicallyCall(withArguments args: [Int]) -> Int { return args.reduce(1, *) } } let multiplier = DynamicMultiplier() multiplier(1, 10) // 10 m..
Swift Concurrency 관련 Instruments 는 총 두가지가 있다. 이 중, Swift Tasks 를 활용하는 법을 기록! WWDC 23 > Analyze hanges with Instruments 와 비슷한 예제를 만들어서 진행해보자. # 1. import SwiftUI struct ContentView: View { var body: some View { ScrollView(.horizontal) { LazyHStack { ForEach(0.. Profile > Swift Concurrency 를 열어준다. (혹은 다른 툴을 열고 Instruments Library 에서 Swift Tasks 를 추가해도 무방하다) 레코딩을 해준 후, App > Thread > Graph Display ..
WWDC 23 > Analyze hanges with Instruments 를 기반하고 있습니다. (40분 쯤 되는데 너무 재밌고 유용함. 강추) # Hang hang 은 delay 를 의미한다고 생각하면 됩니다. Xcode Instruments 에서 녹화버튼을 꾹 누르고 Recording Options 에 가보면 Hang, MicroHang 등 애플이 몇초 기반으로 정의해뒀는 지 볼 수 있고 프로파일링할때 어디까지 리포트되게 할 건지 설정가능합니다. # Hang 만들어보기 Hang 을 유발할 코드를 만들어봅시다. struct ContentView: View { @State private var showImagePicker = false var body: some View { Button(action: ..
# iOS 17 미만 iOS 17 미만에서는 backgroundColor를 먹여도 text Selection이 그 위에 되었음 (iOS 16.4 로 테스트한 결과) 뷰계층구조를 보면 UITextSelectionRectView 가 텍스트를 나타내는 뷰보다 위에 있음을 명확히 알 수 있음. # iOS 17 하지만 iOS 17에서는 계층 구조가 바뀜! (베타이지만 가장 최신버전 iOS 17.2 로 테스트한 결과. 정식 하위버전도 동일함.) 17에서는 RectView가 아니라 RangeView로 바뀌고 글자를 보여주는 뷰 (_UITextLayoutFragmentView) 보다 더 하위에 위치하게 됨 RangeView 상위의 HighlightView 는 iOS 17 에 새로 나온건데 문서에도 behind 라고 적..
렛츠스위프트 2023 에서 민소네님 발표를 통해 external view hierarchy debugger 가 있다는 것을 알게 되었다. (🥹) xcode view hierarchy debugger 를 실행하면 개발하다가 일시중단되는 셈이라 생산성이 낮아지고 오래 멈추고 기다렸는데도 안나오면 마음이 어려움. 두가지 소개해주신 것 정리 ~.~ 1) Lookin - 무료 - 오픈소스 (objc 임..) [ 사용법 ] 위의 사이트에서 맥용 앱을 다운받고 LookinServer 프레임워크를 앱에 embed 한다 (참고) 1. via CocoaPods (Recommended) pod 'LookinServer', :configurations => ['Debug'] 2. via Swift Package Manager..
StoreKit Configuration File 의 기본 priceLocale 는 USD로 되어있다. 이걸 바꾸는 법을 알아보자. 참고로 Setting up StoreKit testing in Xcode 문서에 안나와있어서 이 글을 보고 알게됨! (wwdc 어딘가에 나와있을 것 같음) 파일 내부에 해당 세팅이 없고 다음과 같이 Editor 를 통해 변경한다. StoreKit Configuration File 선택 > Editor > DefaultStorefront 변경 그러면 StoreKit Configuration 아이템들의 price가 원화로 바뀌고 테스트 코드에서도 fetch 해온 product의 priceLocal / price가 원화기준으로 바뀐다. 이제 앱스토어커넥트에서 원화 기준으로 상품 ..
[ 니즈 ] 이렇게 된 구성에서 1. SharedUI 안에 커스텀 폰트를 넣고 프리뷰로 커스텀 폰트를 보고 싶음. 2. SharedUI 를 의존하는 Feature1 타겟의 프리뷰로 커스텀 폰트를 보고 싶음. 3. 앱의 UIKit 기반 코드에서도 SharedUI의 커스텀 폰트를 쓰고 싶음. [ 작업 ] ~~ 귀여운 마루부리 폰트와 함께하는 예제 ~~ # 1. 폰트파일을 넣을 폴더를 원하는 경로에 만들고 Pacakge > resources 추가하기 // swift-tools-version: 5.5 // The swift-tools-version declares the minimum version of Swift required to build this package. import PackageDescript..
Library, Framework, Swift Package 궁금한 것들을 확인해보고 정리합니다. 테스트를 위한 MyApp workspace 를 하나 만들고 시작합니다. [1] Library # 만들기 File > New > Project > Static Library 선택 MyStaticLibrary 라는 이름으로 만들고 아래처럼 경로 / Add to / Group 을 설정해줍니다. # 기본 정보 Target에 가보면 Mach-O Type이 static library 로 세팅 되어있으며 (Project는 Mach-O Type이 명시 안되어있음) 앱에 embed 하면 .a 확장자를 볼 수 있습니다. # 궁금! 만약 Mach-O Type 을 dynamic library 로 바꾸면..?! 다시 import를..
[1] ISA Swizzling Method Swizzling이 런타임에 특정 메서드를 다른 메서드로 바꿔서 실행될 수 있게 하는 것이라면, ISA Swizzling은 런타임에 특정 객체를 다른 객체로 바꿔서 실행될 수 있게 하는 것을 말합니다. (isa 는 포인터를 의미합니다) object_setClass 를 이용해서 isa swizzling을 할 수 있습니다. 예를들어 나의 커스텀 탭바를 사용하고 싶은 상황을 봅시다. TabBarController의 tabBar 프로퍼티는 get only 이고 이를 세팅할 수 없는 이니셜라이저나 메소드가 없습니다. 이 때 isa swizzling을 통해 기본 탭바를 서브클래싱한 커스텀 탭바를 사용할 수 있습니다. private class CustomTabBar: UI..
☑️ 이 글의 제목 - status bar를 hidden한 뷰컨트롤러를 푸쉬했다가 back 했을때 navigation bar가 shrink 되는 현상 - status bar를 hidden한 뷰컨트롤러를 푸쉬했다가 back 했을때 navigation bar 가 status bar 와 overlap 되는 현상 (두가지를 계속 고민하다가 결국 둘다 너무 길어서 찐제목에는 키워드만 적음,,,) ☑️ 주된 테스트 환경 Xcode 13.4.1 / iOS 15 [1] 준비 아래와 같은 상황으로 준비해줍니다 (feat. 노치없는 시뮬레이터!) - A 는 네비게이션의 root 이다. - A 에서 B 를 푸쉬한다 import UIKit class MyNavigationController: UINavigationContro..
- Total
- Today
- Yesterday
- flutter 앱 출시
- flutter deep link
- 플러터 얼럿
- DRF APIException
- cocoapod
- SerializerMethodField
- ribs
- METAL
- Watch App for iOS App vs Watch App
- Django Firebase Cloud Messaging
- Django Heroku Scheduler
- 장고 Custom Management Command
- 플러터 싱글톤
- Dart Factory
- github actions
- 장고 URL querystring
- Flutter getter setter
- Python Type Hint
- flutter build mode
- PencilKit
- Flutter Spacer
- Flutter 로딩
- Flutter Clipboard
- Flutter Text Gradient
- Sketch 누끼
- 구글 Geocoding API
- flutter dynamic link
- drf custom error
- ipad multitasking
- Django FCM
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |