개발/Swift
-
SwiftData 기본 사용법 Model, ModelContext, Query개발/Swift 2025. 5. 8. 09:03
엔티티 정의@Modelfinal class User: Identifiable { var name: String var email: String @Attribute(.externalStorage) var imageData: Data? init(name: String, email: String, imageData: Data? = nil) { self.name = name self.email = email self.imageData = imageData }}@Attribute 매크로 써서 외부 저장소에 저장가능좀 느리지만 큰 데이터 다루는 용도일반적인 내부데이터는 SQLite DB 사용하지만 이것은 Document 폴더에 들어간다고 함ex..
-
TextEditor 자동 스크롤 오류, cursor 위치 따라가기개발/Swift 2025. 4. 18. 17:20
TextEditor 자동 스크롤 오류, cursor 위치 따라가기ScrollView //전체 스크롤이 내려감 -- VStack -- TextEditor(title) -- TextEditor(content) // 여기위와 같은 구조로 되어있음 TextEditor 의 컨텐츠 내용이 길다보면 화면을 넘어가기 떄문에 ScrollView로 감싸서 아래로 쭉 스크롤이 가능할것이다.TextEditor(text: $store.content.sending(\\.setContent)) .focused($focusedField, equals: .content) .frame(minHeight: 160, maxHeight: .infinity) .font(.sy..
-
긴 text 내용이 minHeight에 잘리는 문제 (onAppear, task)개발/Swift 2025. 4. 18. 17:10
의도한 동작은 최소 160의 높이를 가지고 내용이 길수록 TextEditor도 늘어나야 함 TextEditor(text: $store.content.sending(\\.setContent)) .focused($focusedField, equals: .content) .frame(minHeight: 160) .font(.system(size: 16)) .padding(.top, 16)내용을 처음부터 입력 할떄는 정상 동작하지만처음부터 content 가 길 경우 160 높이 에서 잘림, 입력하면 동적으로 늘어남 OnAppear 이후에 컨텐츠 갱신..
-
Observable → Async / Await 으로 변환하여 API 처리하기 (AsyncThrowingStream, withCheckedThrowingContinuation)개발/Swift 2025. 4. 16. 16:35
기존 삭제 기능 은 Observable을 사용하여 구현되었다 private func deleteImage(accessKey: String) -> Observable { return networking.request(.deleteImage(accessKey: accessKey)).asObservable() } 문제점은 해당 API를 요청하는데 사용 하는곳은 async/await 구조로 되어 있다는것이다.그렇다고 Base 네트워크까지 건드릴수는 없기 떄문에 네트워킹 구현체 부분은 수정할수없다그럼 응답을 처리하는곳에서 Rx→ async/await 으로 바꿔주는 로직이 필요하다.EX> UsecasewithCheckedThrowingContinuation웹소켓이나 지속적인 응답을 받는..
-
SwiftUI TextEditor에 키보드 toolbar가 노출되지 않는 오류개발/Swift 2025. 4. 16. 16:31
ScrollView 내부에 두개의 TextEditor가있다 ScrollView { VStack(spacing: 0) { if case .post = store.contentType { TextEditor(text: $store.title.sending(\\.setTitle)) .focused($focusedField, equals: .title) .frame(minHeight: 30) .frame(maxWidth: .infinity) .font(.system(size: 18, weight: .bold)) .padding(.top, 24..
-
[Swift] 애니메이션 정지 재생 CGAffineTransform개발/Swift 2025. 4. 11. 17:11
애니메이션 정지 재생탭 이벤트를 적용할떄 탭을 눌렀다가 떼었을때 처리를 위해서는 Tap Gesture보다는LongPressGesture를 활용하는게 더 간편한다 let tapGesture = UILongPressGestureRecognizer() tapGesture.minimumPressDuration = 0 optionView.addGestureRecognizer(tapGesture)minimumPressDuration 을 0으로 지정하면누르자마자 gesutre.state 가 began 되므로바로 터치다운 이벤트를 시작할수있다 switch gestureState { case .began: optionView.transform = CGAffineTransform(scaleX: 0.9, ..
-
UIKit SwiftUI에서 자동 스크롤개발/Swift 2025. 4. 8. 15:24
UIKit 자동 스크롤자동(동적) 스크롤 하기 위해 uikit 에서도 scrollRectToVisible 제공해줌 layoutIfNeeded() // Init 직후에 아직 내부 레이아웃이 안잡혀서 호출 필요 scrollRectToVisible(button.frame, animated: true) // ScrollView 기능근데 이게 스유 처럼 가운데로 보내주는게 아니라그냥 보이게만 해준다.스크롤 하려는 저 button 이 화면에 아예 안보이면 잘 동작하는데만약 왼쪽 찔끔 나온 상태라면 움직이지 않는 문제가 있음따라서 별도로 스크롤을 계산하여 setContentOffset 호출이 필요함layoutIfNeeded()let buttonCenterX = button.center.x DispatchQueu..
-
WKWebview 에서 post 요청하는방법개발/Swift 2025. 4. 8. 09:46
WKwebview를 사용하여 웹뷰를 로드할떄 load 함수를 사용함 webView.load(request)이떄 들어가는 request는 URLRequest 타입이며url 만 있으면 쉽게 만들수 있다.let request = URLRequest(url: url, cachePolicy: cachePolicy)일반적인 get 요청은 그런데 post 요청을 수행해야 하는 경우는 어떨까?let request = URLRequest(url: url, cachePolicy: cachePolicy) request.httpMethod = "POST" webView.load(request)httpMethod 만 지정해줘서 쉽게 바꿀수 있다.이외 필요한 헤더 (토큰이나 contentType) 를 지정하고request.set..