개발 - iOS SwiftUI 13

iOS SwiftUI Button 탭(클릭) 영역 넓히기

SwiftUI에서 이미지나 텍스트로 버튼을 만들면 탭(클릭) 영역이 너무 작은데, 탭 영역을 넓혀주는 방법입니다. 초기코드 Button(action: { dialog = true }, label: { Image(systemName: "ellipsis") }) .buttonStyle(PlainButtonStyle()) 탭 영역 넓힌 코드 label 크기를 키우고, contentShape(Rectangle()) 해줌 Button(action: { dialog = true }, label: { HStack { Image(systemName: "ellipsis") } .frame(width: 60, height: 50, alignment: .center) .contentShape(Rectangle()) }) ...

iOS SwiftUI List Scroll 맨 아래로 이동 방법

SwiftUI에서 스크롤을 맨 아래로 이동하는 방법 입니다. 일반적인 방법 ScrollViewReader를 사용해서 proxy.scrollTo(list.last, anchor: .bottom)로 이동하면 스크롤이 맨 아래로 이동 합니다. 그런데 가장 마지막 row의 높이가 다른 경우 row의 높이를 계산하지 못해서 제대로 이동되지 않습니다. 이 문제는 에뮬레이터에서는 이상 없었는데 아이폰 실제 기기에서 테스트 하니 문제가 발생했습니다. import SwiftUI struct TestView: View { var list: [String] = ["1111", "1111", "1111", "1111", "1111", "1111", "1111" , "1111", "1111", "1111", "1111", "..

iOS SwiftUI current View 상태 관리 예제

SwiftUI에서 Firebase Message 수신 처리를 하는데, 현재 View가 무엇인지 확인하는 예제 입니다. CurrentViewObject.swift 현재 View를 저장할 수 있는 ObservableObject를 선언 합니다. import Foundation import SwiftUI class CurrentViewObject: ObservableObject { // 현재 View 저장 변수 @Published var currentView: (any View)? func setCurrentView(_ view: AnyView) { currentView = view } } metalkApp.swift 메인함수에서 EnvironmentObject를 설정 합니다. UIApplicationDeleg..

iOS SwiftUI HTTP Multipart POST 예제

SwiftUI에서 HTTP Multipart/form-data POST 예제 입니다. import Foundation import SwiftUI import PhotosUI struct UserProfileView: View { // 사진 선택 @State private var selectedPhotosPickerItem: PhotosPickerItem? = nil @State private var selectedPhotosData: Data? = nil var body: some View { VStack { } .task() { } } // 사용자 정보 저장 func btnSave() { // 랜덤 boundary let boundary = "boundary-\(UUID().uuidString)" //..

iOS SwiftUI EnvironmentObject NavigationStack 예제

SwiftUI에서 navigationPath 변수를 EnvironmentObject로 선언 후 사용하는 예제 입니다. NavigationPathObject.Swift 클래스 생성 변수를 ObservableObject 형태로 만들어줘야 합니다 import Foundation import SwiftUI class NavigationPathObject : ObservableObject { @Published var navigationPath = NavigationPath() } 처음 화면 navigationPathObject를 StateObject로 선언 합니다. 그리고 두번째 화면으로 넘어갈때에는 .environmentObject()로 두번째 화면한테 environmentObject 가 무엇인지 알려줘야 합..

iOS SwiftUI 위치 사용권한 요청 예제

SwiftUI에서 위치 사용권한 요청하는 간단 예제 입니다. 프로젝트 설정에서 Privacy - Location When in Use Usage Description 추가 위치 사용권한 요청 예제 import Foundation import SwiftUI import CoreLocation struct AgreeView: View { var body: some View { VStack { } .task() { await startTask() } } func startTask() async { // 위치 사용 권한 설정 확인 let locationManager = CLLocationManager() let authorizationStatus = locationManager.authorizationStatu..

iOS SwiftUI Firebase didRegisterForRemoteNotificationsWithDeviceToken 호출 안됨

SwiftUI에 Firebase를 적용하려고 하는데 new Token이 발급 되면 호출되어야할 didRegisterForRemoteNotificationsWithDeviceToken 가 호출 되지 않아서 해결한 방법입니다. FirebaseAppDelegateProxyEnabled 프라퍼티 추가 프로젝트 설정에서 FirebaseAppDelegateProxyEnabled 프라퍼티를 NO 값으로 추가 합니다. didFailToRegisterForRemoteNotificationsWithError 함수 추가 Firebase에서 에러가 발생하면 didFailToRegisterForRemoteNotificationsWithError 함수에서 출력할 수 있습니다. 이것 알아내는데도 많은 시간 소비 했습니다. impo..

iOS SwiftUI Xcode Firebase 패키지 추가 방법

FCM 가이드 문서에는 아래 주소로 추가하라고 되어 있는데, 안되어서 헤맸습니다. https://github.com/firebase/firebase-ios-sdk Add Package Collection 에서 추가 하면 안됩니다. (X) 오류 : Received invalid response at https://github.com/firebase/firebase-ios-sdk. Please make sure it is a package collection URL. 오른쪽 상단 검색에다가 넣고 추가 해야 합니다. (O)

iOS SwiftUI HTTP POST 요청 후 JSON 응답 파싱 예제

SwiftUI에서 HTTP POST 요청후 JSON 응답 처리하는 기본 예제 입니다. 가독성 좋게 옵셔널은 Unwrapp 하였습니다. JSON 형식으로 POST 요청 예제 import SwiftUI import WebKit struct IntroView: View { var body: some View { VStack { } .task() { await startTask() } } func startTask() async { // 서버 사용자 정보 확인 let body: [String: Any] = ["userId": "test01", "authToken": "11111111111111"] let jsonData = try? JSONSerialization.data(withJSONObject: body)..

iOS SwiftUI onAppear에서 뷰 화면 이동 예제

onAppear에서 뷰 화면 이동을 하려면 NavigationPath와 NavigationStack을 사용해야 합니다. 그냥 화면 이동하는 것도 힘드네요. 하면 할 수록 Swift 이상함 ㅋㅋ import SwiftUI import WebKit struct IntroView: View { @State var navigationPath = NavigationPath() var body: some View { NavigationStack(path: $navigationPath) { VStack { } .navigationDestination(for: String.self) { view in if view == "AgreeView" { AgreeView() } } .onAppear { startMain() }..