IOS

    [IOS] UIGestureRecognizer 사용해서 지도 조작하기

    출시 프로젝트에서 사용한 네이버 지도는 기본적인 제스처가 설정돼있다. 일반적으로 Pan 제스처는 카메라를 상하좌우로 이동시키고, Pinch 제스처는 카메라의 확대 축소를 담당한다. 그런데 사용자 주변의 특정 장소를 찾는다는 앱의 특성 상 사용자의 위치를 중심으로 지도의 카메라가 움직이는 새로운 조작법을 만들고 싶었다. 이 글은 게임 포켓몬고의 제스쳐 액션을 UIGestureRecognizer를 통해 구현한 경험을 정리한 글이다. 1. 분석 포켓몬고의 메인 화면에서 Pan제스처는 카메라의 회전을 담당한다. 캐릭터를 중심으로 원을 그리면서 Panning하면 해당 방향(시계 또는 반시계)으로 카메라가 회전한다. 이 제스처로 사용자 위치 주변을 360도로 둘러볼 수 있다. 또한 포켓몬고의 Pinch 제스처는 카..

    [IOS] Realm 사용해서 데이터 저장하기

    출시 프로젝트 중 API 통신으로 받아온 데이터를 앱 내부에 저장해놓고 사용해야 했는데 Realm SDK를 사용해서 데이터 모델을 설계했던 경험을 정리한 글이다. 1. 클래스 Realm은 DB에 저장할 타입으로 클래스를 사용한다. 구조체를 사용하지 않는 가장 큰 이유는 "live"에 포커스를 맞춰서 그렇다고 한다. Realm DB에 저장하려는 클래스는 Object 클래스를 상속해야하고 내부 프로퍼티에 @Persisted 라는 property wrapper 속성을 사용한다. class Place: Object { @Persisted(primaryKey: true) var contentId: Int @Persisted var image: String } 위의 Place 클래스는 DB에서 하나의 테이블처럼 취..

    [IOS] API 통신에서 겪은 SSL 인증서 및 ATS 관련 이슈에 대하여

    출시 프로젝트에서 공공데이터포털의 투어 API를 사용했다. HTTPS를 지원하는 API 서비스였기 때문에 출시 과정에서 문제없이 ATS를 사용할 수 있을 거라고 생각했지만 결국 보안 관련 이슈를 겪게됐고 문제의 원인과 해결 방법을 작성한 글이다. 1. 이슈를 겪게된 과정 나는 공공데이터포털에서 제공하는 오픈 API 서비스를 출시 앱에 사용하기 위해서 Alamofire를 통해 제공되는 URL로 네트워크 요청을 시도했는데 아래 콘솔 메시지가 출력됐다. Result : FAIL Error : Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." ..

    [IOS] NaverMap SDK 사용 중 알게된 Git LFS에 대하여

    출시 프로젝트 중에 사용한 네이버 지도 SDK를 Git에 업로드하기 위해서 사용했던 방법을 공유한다. 1. Git LFS 란? LFS는 Large File Storage의 약자로, Git에서 관리중인 파일을 원격 서버에 업로드할 때 GitHub에는 업로드 가능한 용량 제한(100MB 미만)이 존재한다. Git LFS는 오디오, 비디오 같은 큰 용량의 파일을 GitHub에 업로드 하려고 할 때 해당 파일들을 다른 원격 서버에 별도로 저장하고 GitHub에는 그 파일에 대한 포인터만 저장하게 해주는 오픈소스이다. 2. 사용 방법 1) Git LFS 설치 먼저 homebrew를 사용해서 Git LFS를 설치해준다. $ brew install git-lfs 홈브루가 설치돼있지 않다면 아래 링크에서 설치해주자. ..

    [IOS] CocoaPod의 pod install 오류에 대하여

    코코아팟을 사용해 네이버 지도 SDK를 설치하던 중 터미널에서 에러 메시지를 받았다. pod파일 내에 라이브러리의 버전 또는 깃허브 주소를 명시하지 않아서 생긴 문제는 있었지만 이번에 겪은 오류는 아예 다른 문제였기에 포스팅을 한다. 1. 문제 LoadError - dlsym(0x7f8926035eb0, Init_ffi_c): symbol not found - /Library/Ruby/Gems/2.6.0/gems/ffi-1.13.1/lib/ffi_c.bundle /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require' /System/Lib..

    [IOS] UIView의 tintColor 프로퍼티에 대하여

    앱의 화면에서 일관된 글자색과 배경색을 적용하기 위해 tintColor 프로퍼티를 사용하면서 공부하고 경험한 내용을 정리한 글입니다. 1. tintColor의 정의 애플의 개발자 문서에서는 다음과 같이 설명하고 있다. The first nondefault tint color value in the view’s hierarchy, ascending from and starting with the view itself. UIView의 틴트 컬러란 자기 자신의 뷰 객체부터 시작하여 뷰 계층을 따라 올라가면서 처음 만나는 default가 아닌 tintColor의 값을 리턴해주는 프로퍼티이다. tintColor는 시스템 UI가 활성화 상태일때 시각적으로 보여지며, system 타입의 UIButton에서 흔히 볼 ..

    [IOS] UserDefault 사용해보기

    간단한 예제를 통해 UserDefault를 사용해보고 작성한 코드를 리뷰하는 글입니다. 1. UserDefault란 앱에 대한 사용자의 데이터를 저장하는 애플의 기본 저장소 앱 마다 존재하며 샌드박스 시스템에 의해 관리됨 주로 푸쉬 알람 허용과 같은 사용자의 환경설정 값 등 가벼운 데이터가 저장됨 key-value 쌍의 형태로 데이터가 저장됨 2. 예제 1) 감정 다이어리 9가지 감정을 열거형 case로 정의 열거형의 rawValue를 UserDefault의 key로 사용 화면 로딩 시 감정별로 저장된 value를 읽어서 각 버튼의 타이틀에 보여줌 버튼 터치 시 value+1 을 새로운 값으로 저장하고 버튼 타이틀을 변경 @IBAction func touchButton(_ sender: UIButton..

    [IOS] 열거형을 사용해서 간단한 앱 만들어보기

    텍스트필드에 단어를 입력하면 단어의 뜻을 보여주는 간단한 앱을 만들면서 작성한 코드를 리뷰하는 글입니다. 1. 레이아웃 검색창(텍스트필드) 높이 = 루트뷰의 0.06배 검색 버튼 아이콘 (돋보기) 크기 SymbolConfiguration large로 설정 검색 창 아래 4개의 해시태그 버튼 각각의 Content Inset을 상하좌우 5 만큼 설정 → default 스타일의 버튼은 내부 글자 사이 여백이 좁아서 답답해보이기 때문에 가장 오른쪽 버튼의 trailing constraint를 최소 20으로 설정 → 버튼의 텍스트가 길어져도 최소한 루트뷰의 trailing보다 20만큼의 간격을 유지 컨테이너 뷰 생성해서 루트뷰 중앙에 위치시키고 좌우 20의 간격 설정, 컨테이너 뷰 높이 = 루트뷰의 0.4배 → ..

    [IOS] AutoLayout으로 현업의 서비스 화면 구성하기

    오토 레이아웃을 통해 현 서비스의 앱 화면을 만들면서 작성한 코드를 리뷰하는 글입니다. 1. 주문하기 화면 탭바의 첫번째 네비게이션 컨트롤러 배너 높이를 루트 뷰 높이의 0.2배로 설정 음식 카테고리 버튼들을 레이아웃 하기위해 1개의 수직 스택뷰와 4개의 수평 스택뷰 사용 수직 스택뷰 상하좌우에 20의 간격을 주어 수직 스택뷰의 너비와 높이 결정 수평 스택뷰의 높이를 결정하기 위해 수직 스택뷰 distribution을 fill equally 설정 하나의 수평 스택뷰에 4개의 서브뷰(어레인지뷰)가 들어감. 수평 스택뷰 distribution을 fill equally로 설정해서 각 서브뷰의 너비 결정 수평 스택뷰의 서브뷰들 간의 공간은 (spacing) 20 서브뷰(음식 카테고리) 하나의 높이와 너비가 결정..

    [IOS] 스플래시 화면과 다크모드 대응 화면 만들기

    간단한 앱을 만들면서 정규식, 커스텀 컬러 셋, 스플래시 뷰를 사용했던 경험을 리뷰하는 글입니다. 1. SplashViewController Main 스토리보드의 엔트리 포인트 Lottie 라이브러리를 사용해 애니메이션 재생 (Launch Screen을 안쓴 이유) 애니메이션이 끝나면 segue를 통해 SignUpViewController로 이동 class SplashViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let animationView = AnimationView(asset: "movie") view.addSubview(animationView) animationView.frame = vi..