본문 바로가기

분류 전체보기

(351)
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(..
00. 시작하며 시작하며 최근 그림 AI에 대한 관심이 뜨겁다. 가장 처음 소식을 접한 건 미술전에서 수상을 했다는 이야기였다. '미술전 1등' 이 그림 두고 시끌…"아주 더러운 일" 예술가 분노 인공지능(AI)이 그린 작품이 미술전에서 1위를 차지하면서 예술가들을 중심으로 공정성 논란이 제기되고 있다. 3일(현지시간) CNBC 등 외신에 따르면 게임 기획자 제이슨 앨런은 최근 열린 미국 콜 n.news.naver.com 방식은 이렇다 원하는 그림에 대한 키워드들을 넣고 최대한 많은 그림을 생성한 다음 마음에 드는 그림을 골라 적당히 업스케일하고 제출하면 된다. 대회에 이를 숨기고 출전하여 상금을 가져가는 건 문제가 있겠지만, 그림을 그렸던 때의 노력과 들어간 시간을 생각해 보면 1회성 삽화나 일러스트로는 상당한 이점을..
11. 기능 구현하기 #3 기능 구현하기 #3 UserInformation UserInformation | UserModel struct User: Identifiable, Codable { @DocumentID var id: String? let username: String let fullname: String let profileImageUrl: String let email: String } Firebase에서 받아와 사용할 수 있도록 User 데이터에 대한 모델을 구성한다. UserInformation | UserService import Firebase import FirebaseFirestoreSwift Firebase에서 사용자의 정보를 받아오기 위한 함수를 작성한다. 이를 위해 Firebase와 FirebaseFi..
10. 기능 구현하기 #2 기능 구현하기 #2 프로필 이미지 설정하기 ImagePicker SwiftUI를 사용하는 앱에서는 iOS16 혹은 동세대의 OS 이상을 사용하는 경우 PhotosUI를 사용하도록 개선이 이루어졌다. 물론 iOS16 이상을 대상으로만 서비스를 한다면 문제가 없겠지만 세상은 그리 녹록지 않기 마련이다. 이전까지는 PHPickerViewController나 UIKit의 UIImagePickerController를 사용해야만 한다. 영상에서는 UIImagePickerController를 사용하는 방식을 사용했으므로 이에 대해 나열한다. Utils 폴더를 하나 만들어 주고, 그 안에 ImagePicker를 구현한다. import SwiftUI struct ImagePicker: UIViewControllerRep..
09. 기능 구현하기 #1 기능 구현하기 #1 Firebase Import & Login Function Firebase Import 02. Firebase 연결하기 Firebase 프로젝트 생성 Firebase에 회원가입을 하고, 'Get started'를 선택한다. 프로젝트를 생성하고, 이름을 지정한 뒤 지금은 필요 없는 Google Analystic은 비활성화한다. 해당 기능은 Google의 분석 툴로, chillog.page 기본적인 방법은 위와 같다. 다만 사용하려는 모듈은 조금 다른데 아래와 같다. 회원가입과 로그인 기능을 위한 'FirebaseAuth', DB 접근을 위한 'FirebaseFirestore'와 'FirebaseFirestoreSwift', 이미지 등의 큰 데이터를 저장하고 불러 올 'FirebaseSt..
iOS 스크롤샷 이미지로 저장하기 iOS14 부터 기본 브라우저인 Safari에 한해 FullPage Screenshot(ScollShot)을 지원한다. 문제는 어째서인지 이걸 JPG나 PNG가 아니라 PDF로 저장하도록 해 놨다는 점인데, Web2Pics나 PicSew같은 유료 앱들을 사용하는 방법도 있지만 조금 번거롭기도 한 게 사실이고, 이를 단축어로 조금 편하게 해결할 수도 있다. 1.0 Pdf To Image www.icloud.com 문서화 구조도 매우 단순한 단축어다. 표시한 부분을 선택해 PNG가 아닌 원하는 형식으로 저장할 수도 있다. 동작 예시 스크린샷 창에서 공유 버튼을 눌러 사용하면 된다.
[~2022.10.31] 홍대, 잠실, 성수, 영등포, 창덕궁, 할로윈 (Ricoh GR 3x, EOS 77D. iPhone 13 mini) 서론 사용한 카메라는 Ricoh GR3x와 iPhone 13 mini 아이폰으로 촬영한 사진이 월등히 적기 때문에 별도로 기재해 두겠다. 대부분 보정 없음. 보정이 들어간 사진은 언급을 해 두도록 하겠다. 본론 10월 3일 | 홍대, 온미동 밥이 먹고 싶어 다른 메뉴들을 제치고 돈부리를 선택했다. 간이 적당하고 맛도 준수. 부타동 같은 원래의 메뉴들은 일찍 동이 났는지 주문할 수 없었다. | 홍대, 디어다온 기본적으로 커피와 디저트를 파는 카페. 앞에 두고도 있는지 모를 만큼 작고 소중한 느낌이다. 주력은 푸딩으로 쨍하게 달지 않아 부담스럽지 않은 맛있는 푸딩이었다. 사진엔 없지만 주문한 메뉴는 초콜릿과 시리얼 사장님도 따듯하게 친절하시고, 인테리어는 소녀감성이 한 양동이 첨가됐다. 비가 오는 날이라 맑..
08. 기본 UI 구현하기 #8 기본 UI 구현하기 #8 CustomTextField & AuthHeaderView & RegistrationView CustomTextField 더보기 Source VStack(spacing: 40) { TextField("Email", text: $email) SecureField("Password", text: $password) } .padding(.horizontal, 32) .padding(.top, 44) LoginView에서 사용했던 두 개의 TextField는 이미지와 TextField 혹은 SecureField, Divider의 조합으로 이루어져 있다. 같은 UI가 동일하게 RegistrationView에서도 사용되기 때문에 재사용을 용이하게 하기 위해 모듈화 한다. 더보기 Source..
07. 기본 UI 구성하기 #7 기본 UI 구성하기 #7 LoginView 계정 로그인에 사용할 UI를 구성한다. LoginView | Header Login 화면의 상단에 해당하는 부분이다. 푸른색의 배경과 두 줄의 TextView로 이루어져 있다. 더보기 Source VStack(alignment: .leading) { HStack { Spacer() } Group { Text("Hello.") Text("Welcom Back") } .font(.largeTitle) .fontWeight(.semibold) } .frame(height: 260) .padding(.leading) .background(Color(.systemBlue)) .foregroundColor(.white) .clipShape(RoundedShape(corne..
06. 기본 UI 구성하기 #6 기본 UI 구성하기 #6 FloatingButton & NewTweetView FloatingButton 메인 화면 어디서든 새 글을 작성할 수 있도록 FeedView 위에 표시되는 FloatingButton을 생성한다. 더보기 Source struct FeedView: View { var body: some View { ZStack(alignment: .bottomTrailing) { ScrollView { LazyVStack { ForEach(0 ... 20, id: \.self) { _ in TweetRowView() .padding() } } } Button { print("this is Floating Button Function") } label: { Image("tweet") .resizab..