Swift: iOS에서 커스텀 카메라 만들기 (2) – AVCapturePhotoOutput으로 고화질 사진 찍기

소개 이전에도 한 차례 커스텀 카메라에 대해 다룬적이 있는데 해당 방식은 비디오의 프레임을 캡처해서 저장하는 방식이었습니다. Swift: iOS에서 커스텀 카메라 만들기 (1) – 비디오 캡처 방식 활용 이러한 방식에 대한 장점도 많이 있지만, 해상도가 상대적으로 낮은 단점도 있어서 다른 방식인 AVCapturePhotoOutput을 이용해 고화질의 사진을 얻는 방법에 대해 알아보겠습니다. 스토리보드(UIKit) 기준으로 더보기…

Swift: async/await 키워드를 이용한 동기적 실행 보장 함수 작성

소개 이른바 ‘콜백 지옥’을 해결하기 위해 Swift 5.5 버전부터 등장한 키워드입니다. 자바스크립트 ES6에서 도입된 async및 await와 목적이 거의 같습니다. 자바스크립트: 콜백, Promise, async – await 기초 콜백 지옥(Callback Hell) 콜백 지옥은 JavaScript를 이용한 비동기 프로그래밍시 발생하는 문제로서, 함수의 매개 변수로 넘겨지는 콜백 함수가 반복되어 코드의 들여쓰기 수준이 감당하기 힘들 정도로 더보기…

Swift: iOS에서 커스텀 카메라 만들기 (1) – 비디오 캡처 방식 활용

iOS에서 커스텀 카메라 만들기 원문 Making A Custom Camera In iOS 우리는 iOS에서 어떤 형태로든 커스텀 카메라를 봐왔습니다만, 어떻게 직접 카메라를 커스텀할 수 있을까요? 이 튜토리얼에서는 기본 사항을 다루면서 동시에 고급 구현 및 옵션에 대해 설명합니다. 곧 알게 되겠지만 iOS 기기에서 오디오/비디오 하드웨어 상호 작용에 관한 옵션은 많습니다! 항상 그렇듯이 더보기…

Swift: RealityKit 프로젝트에 .rcproject(Reality Composer 프로젝트 파일) 추가하고 앱에 통합하기

소개 Reality Composer 앱으로 만든 프로젝트를 Swift iOS 프로젝트에 추가하고 앱에 연동(통합)시키는 방법입니다.   방법 1) 프로젝트 생성 Augmented Reality App Content Technology를 RealityKit으로 설정 이 상태에서 프로젝트를 실행하면 Experience.rcproject라는 프로젝트 파일이 이미 존재하며 앱을 실제 기기에서 실행하면 박스가 하나 표시될 것이지만, 이 포스트에서는 해당 기본 파일을 사용하지 않고 다른 더보기…

Swift: UIKit 프로젝트 안에 SwiftUI 뷰 삽입하기 (UIHostingController 이용)

소개 SwiftUI: Representable을 이용해서 UIViewController 띄우기 SwiftUI: 하드웨어 키보드 입력 받기 (Representable 사용) SwiftUI: 웹 뷰(WKWebView) 추가하기 및 자바스크립트 실행 (Representable 사용)   이전에 SwiftUI 프로젝트 안에 UIKit 기반으로 만들어진 뷰 컨트롤러나 뷰를 집어넣는 방법에 대해 여러 차례 포스팅한적이 있었는데, 그 반대의 경우도 가능합니다. UIKit 프로젝트에서 SwiftUI로 만든 View를 삽입하는 더보기…

SwiftUI: Tab View (탭 뷰) 사용하기 기초 (탭 바 형태, 페이지뷰 형태)

소개 SwiftUI의 TabView를 이용해 다음 두 가지 형태의 뷰를 만들 수 있습니다. 탭 바가 있는 뷰 형태 페이지 인디케이터가 있는 페이지 뷰 형태   기본 형태 TabView { MyCustomView() MyCustomView() MyCustomView() MyCustomView() } //.tabViewStyle(.page) //.indexViewStyle(.page(backgroundDisplayMode: .always)) TabView 트레일링 클로저 안에 표시할 뷰를 추가합니다. tabViewStyle은 페이지로 표시할 지, 또는 탭 바 더보기…

SwiftUI: Long Press 처리 (일반적인 경우와 지속적으로 눌렀을때의 경우)

소개 SwiftUI에서 일반 탭 외에 길게 눌렀을때의 동작을 어떻게 처리하는지 알아보겠습닌다. 먼저 Long Press라는 동작에 대한 이해가 선행되어야 합니다. Long Press는 누르는 동안 동작이 지속되지 않습니다. minimum duration(최소 지속 시간)동안 press가 되었다면 계속 누르고 있다 하더라도 minimum duration 후에 최후의 동작 (onEnded)을 1회 실행하고 끝이 납니다. 지금은 사용하지 않는 아이폰의 더보기…

WWDC 23 Swift Student Challenge 수상하였습니다. (Award Recipient)

소개 이번에 애플에서 주최한 WWDC23 Swift Student Challenge(스위프트 스튜던트 챌린지)에 응모하였는데 운이 좋아서 수상하였습니다. 영어로 Award Recipient라고 나와있는데 비공식 용어로는 Winner로 일컫기도 합니다. 사실 작년까지는 이런 공모전이 있는지도 몰랐는데 올해 어떻게 정보를 알게되어 응모하게 되었습니다. Student Challenge에 대한 자세한 내용은 https://developer.apple.com/kr/wwdc23/swift-student-challenge/ 에서 볼 수 있습니다. 이름은 Interval Fairy라는 앱으로, 제작기간은 더보기…

SwiftUI: 웹 뷰(WKWebView) 추가하기 및 자바스크립트 실행 (Representable 사용)

소개 SwiftUI 내부에 웹 뷰(WKWebView)를 추가하는 방법입니다. 원래 웹 페이지를 표시하는 WKWebView는 UIKit과 호환되는 요소인데, 찾아본 결과 SwiftUI에는 웹을 표시할 수 있는 뷰가 없는 것처럼 보여서 역시 Representable을 이용해서 간접적으로 추가하는 방법을 설명하겠습니다.   방법 두 가지 방법을 알아보겠습니다. 단순히 SwiftUI에 웹 뷰를 추가하는 방법입니다. 위 예제의 웹 뷰에서 evaluateJavaScript(_:)를 더보기…

SwiftUI: 하드웨어 키보드 입력 받기 (Representable 사용)

소개 SwiftUI 앱에서 하드웨어 키보드의 입력을 받는 방법입니다. 여기서 하드웨어 키보드란 iOS/iPadOS 환경에서는 USB 키보드, 블루투스 키보드, 액세서리 키보드 등을 뜻하며, Mac Catalyst/M시리즈 CPU 등 맥 환경에서 실행되는 경우에는 노트북의 키보드, 유선 키보드, 블루투스 키보드 등을 뜻합니다. 하드웨어 키보드의 입력에 대한 처리란 이런 키보드에서 키를 눌렀을 때 해야할 작업을 뜻합니다. 더보기…