본문 바로가기

분류 전체보기

(350)
15. 기능구현 #4 기능구현 #4 ExploreView ExploreView | UserService > fetchUser struct UserService { func fetchUser(withUid uid: String, completion: @escaping(User) -> Void) { Firestore.firestore().collection("users").document(uid).getDocument { snapshot, _ in guard let snapshot = snapshot else { return } guard let user = try? snapshot.data(as: User.self) else { return } completion(user) } } } UserService는 현재 fetchUs..
14. 버그 수정 #1 버그 수정 #1 Authentication, NavigationView 중복 표시 문제 Authentication | AuthViewModel > login before func login(withEmail email: String, password: String) { Auth.auth().signIn(withEmail: email, password: password) { result, error in if let error = error { print("debug: failed to signin \(error.localizedDescription)") return } guard let user = result?.user else { return } self.userSession = user print(..
13. DB와 연결하기 #2 DB와 연결하기 #2 프로필 사진 표시하기 프로필 사진 표시하기 | Kingfisher import 하기 Kingfisher GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web. github.com URL을 사용해..
12. DB와 연결하기 #1 DB와 연결하기 #1 Link UserData to SideMenu Link UserData to SideMenu | AuthViewModel class AuthViewModel: ObservableObject { @Published var userSession: FirebaseAuth.User? @Published var didAuthenticateUser = false @Published var currentUser: User? private var tempUserSession: FirebaseAuth.User? private let service = UserService() init() { self.userSession = Auth.auth().currentUser fetchUser() } 현재 접..
05. 인터페이스 디자인 #2 인터페이스 디자인 #2 앱 설정, 디자인 다듬기 앱 설정 기기의 모든 상태에 대처할 수 있다면 더할 나위 없이 좋겠지만, 가진이 없다면 예상이 되는 상황은 미리 차단하는 것도 방법이다. 앱 설정 | 화면 방향 고정하기 인터페이스를 디자인할 때 offset 등의 고정값을 사용하지 않았기 때문에 큰 문제는 없지만, 이렇게 화면의 방향이 바뀌면 서로의 영역을 침범하는 문제가 생긴다. 따라서 이 앱에서는 Portrait 모드만 지원하도록 앱의 Deployment Info를 변경한다. 이제부터 이 앱은 iPhone의 Portrait 모드 상태로만 제공된다. 앱 설정 | 화면 모드 고정하기 애플은 iOS13부터 darkmode를 지원하기 시작했다. 기본으로 제공하는 API에는 대비가 돼있어 크게 신경 쓸 부분은 없..
04. 기능구현 #3 기능구현 #3 이미지 저장 이미지 저장 | 저장 기능 이미지를 생성하다 마음에 들면 앨범에 저장해 공유할 수 있도록 기능을 구현한다. .toolbar { ToolbarItem(placement: .navigationBarLeading) { NavigationLink { InfoView() } label: { Image(systemName: "info.circle") } } ToolbarItem(placement: .navigationBarTrailing) { Button { //share } label: { Image(systemName: "square.and.arrow.up") } } } 앞서 생성한 ToolbarItem에 기능을 추가한다. .toolbar { ToolbarItem(placement: ..
SwiftUI에서 Blur를 사용하는 4가지 방법 Blur Apple Developer Documentation developer.apple.com struct ContentView: View { var body: some View { ZStack() { Image("bg.sample") .resizable() .ignoresSafeArea() .scaledToFill() .blur(radius: 20) Text("Blur") .font(.largeTitle) .foregroundColor(.white) } } } iOS13 부터 지원하는 blur는 가장 간단한 방법이지만 Image Layer에 적용해야 한다는 단점이 존재한다. 이는 해당 방식으로는 TextView의 frame에만 blur 효과를 주기 어렵다는 의미이기도 하다. VisualEffect ..
03. 기능구현 #2 기능구현 #2 이미지 표시하기 이미지 표시하기 | ContentView > Button struct ContentView: View { @ObservedObject var viewModel = ViewModel() @State var image: UIImage? @State var text = "" var body: some View { NavigationView { VStack { Spacer() 앞서 초기화 한 ViewModel을 사용하기 위해 ObsevedObject로 viewMocdel 인스턴스를 생성한다. var body: some View { NavigationView { VStack { Spacer() if let image = image { Image(uiImage: image) .resi..
02. 기능 구현 #1 기능 구현 #1 OpenAiKit OpenAIKit | APIKey 생성 간단한 회원가입을 하고, 'View API Keys'를 선택한다. 화면에 표시되는 'Create new secret key' 버튼을 눌러 API Key를 생성하면 되는데, 이후 표시되는 안내창에 적혀있듯 확인창을 닫으면 Key는 더 이상 확인 할 수 있는 방법이 없다. 따라서 닫기 전에 복사 할 수 있도록 하고, 메모장 등에 적어 놓도록 하자. OpenAiKit | Import Swift Package Manager를 사용해 Package를 추가한다. GitHub - MarcoDotIO/OpenAIKit: Swift Package for OpenAI's API Swift Package for OpenAI's API. Contribu..
01. 인터페이스 디자인 #1 인터페이스 디자인 #1 ContentView 간단한 기능을 하는 만큼 간단한 구성을 가진다. NavigationView toolbar ImageView TextView TextField Button ContentView | NavigationView & Toolbar struct ContentView: View { var body: some View { NavigationView { VStack { } .navigationTitle("Image Generator") .toolbar { ToolbarItem(placement: .navigationBarLeading) { Button { //info } label: { Image(systemName: "info.circle") } } ToolbarItem(..