본문 바로가기

Swift

(33)
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: ..
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(..
00. 시작하며 시작하며 최근 그림 AI에 대한 관심이 뜨겁다. 가장 처음 소식을 접한 건 미술전에서 수상을 했다는 이야기였다. '미술전 1등' 이 그림 두고 시끌…"아주 더러운 일" 예술가 분노 인공지능(AI)이 그린 작품이 미술전에서 1위를 차지하면서 예술가들을 중심으로 공정성 논란이 제기되고 있다. 3일(현지시간) CNBC 등 외신에 따르면 게임 기획자 제이슨 앨런은 최근 열린 미국 콜 n.news.naver.com 방식은 이렇다 원하는 그림에 대한 키워드들을 넣고 최대한 많은 그림을 생성한 다음 마음에 드는 그림을 골라 적당히 업스케일하고 제출하면 된다. 대회에 이를 숨기고 출전하여 상금을 가져가는 건 문제가 있겠지만, 그림을 그렸던 때의 노력과 들어간 시간을 생각해 보면 1회성 삽화나 일러스트로는 상당한 이점을..
사라진 'Info.plist' 파일 다시 만들기 프로젝트를 생성하거나 기존에 생성된 프로젝트를 사용하려는 경우 필요한 'Info.plist' 파일이 보이지 않는 경우가 있다. 문제를 해결해 보자 해결법은 간단하다. Project > Targets > Info 로 접근한 뒤 Key에 'App Transport Security Settings'를 추가하고 하위에 'Allow Arbitrary Loads'를 추가한다. Value는 'YES'로 설정한다. 짠, 간단하게 'Info.plist' 파일이 다시 나타났다.
207. URL Loading System URL Loading System iOS는 URL을 사용해 서버와 통신한다. 이를 가능하게 하는 URL Loading System은 서버연동, 다운로드, 업로드에 필요한 다양한 API를 제공한다. URL Session URL Session은 네트워크 연결 설정과 요청, 응답을 처리하는 역할을 한다. Shared Session 단순한 네트워크 요청 기본값을 사용하며, Completion Handler를 사용해 완료값을 반환한다. Background 전송을 지원하지 않는다. Default Session 직접 Session을 구성할 때 사용한다. Delegate를 사용해 세부적인 제어가 가능하다. Disk Memory Cache에 완료값을 저장한다. Ephemeral Session Default Session..
173 ~ 174. Advanced Topic Availiability Condition API 가용성을 확인하는 방법이다. 새로운 OS가 출시되면 새로운 기능을 위한 API가 추가된다. 매번 최신 API를 사용한다면 좋겠지만 현실적으로 불가능한 경우가 많다. 새 애플리케이션을 생성하면 배포 타깃은 자동으로 최신 버전으로 지정된다. 이 상태로 배포하게 되면 해당 버전보다 낮은 상태의 기기들은 이 앱을 사용할 수 없다. 따라서 최신버전 보다는 2~3 정도 낮은 버전을 타깃으로 설정한다. class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. navigati..
170 ~ 172. Selector, Keypath, Dynamic Access Selector (셀렉터) Selector(셀렉터)는 UIkit에서 method를 지칭하거나, 속성의 getter나 setter를 지칭할 때 사용한다. '지칭한다.'의 의미는 호출한다는 의미가 아닌, 대상을 가리키는 특별한 인스턴스를 얻는다는 뜻이다. 이러한 인스턴스는 버튼과 메소드를 연결하거나, 제스쳐와 메소드를 연결할 때 사용한다. Syntax #selector(methodName) #selector(getter: propertyName) #selector(setter: propertyName) struct Figure { let color: UIColor = .blue func draw() { print("draw") } } let selector = #selector(Figure.draw) 결과 ..