일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- scroll indicator
- 세븐모바일
- git
- viewWillDisappear
- graceful termination
- 스크롤 인디케이터
- 클로저
- SWIFT
- 뷰컨
- viewDidAppear
- swift haptic
- 이니셜라이저
- 우아한 앱종료
- IOS
- 아이폰
- 런치 스크린
- viewcontroller
- 스토리보드
- 스위프트
- 레이아웃 사이클
- without Storyboard
- loadView
- 알뜰폰
- exit()
- refreshControl
- do try catch
- 깃헙
- FeedbackGenerator
- viewDidDisappear
- indicator style
- Today
- Total
목록SWIFT (12)
예거's Bicycle for the mind

안녕하세요. 예거입니다. 😄 얼마 전에 종료된 프로젝트에서 처음으로 당겨서 새로고침(Pull to Refresh) 기능을 구현해봤습니다. 스크롤 뷰(ScrollView) 리스트 형태를 갖는 화면을 간단한 제스처 만으로 새로고침 할 수 있는 기능인데요. 당근마켓이나 인스타그램에서도 습관처럼 사용하는 기술입니다. 오히려 너무 자연스러워서, 없으면 어색할 정도죠. iOS 에서는 이 기능을 어떻게 구현하나 싶었는데, 다행히도(?) 간편하게 구현할 수 있도록 클래스나 프로퍼티들이 준비되어 있더라구요. 1️⃣ UIRefreshControl 클래스와 구현 코드 UIRefreshControl 라는 클래스를 사용하면 됩니다. 개요(Overview)를 짧게 읽어보죠. 우선, UIScrollView 클래스를 포함해서 이 클..

iOS를 공부하면서, 늘 스토리보드를 위주로 UI를 구성하다가, 처음으로 스토리보드 없이 UI 화면을 만들어야 하는 과제가 주어졌습니다. 구글링을 하며 여러 블로그를 참고했는데, 정확하지 않은 정보가 많아 시행착오를 꽤 겪었습니다. 이번 글에서는 스토리보드 없이 UI를 만드는 구체적인 프로세스와 시행착오를 공유해보고자 합니다. 1️⃣ 먼저, Main.storyboard 파일 삭제하기 주제와 관련해서 구글링을 해보면 Main.storyboard 파일을 삭제해야 한다는 내용은 공통적으로 나옵니다. 긴 말이 필요 없겠죠. 디렉토리에서 Move to Trash 해줍니다. 2️⃣ info.plist 수정하기 그다음 순서는 프로젝트의 메타 데이터가 담긴 info.plist 파일을 수정하는 것인데요. 개발 진행 상황..

스크롤 뷰와 스크롤 인디케이터 아마 우리 모두는 하루에도 수백 번씩 스크롤 뷰를 사용할 거라 확신합니다. 😄 마우스의 휠을 통해 드르륵, 드르륵. 또는 손가락을 이용해서 휙휙 화면을 위, 아래로 움직이는데요. 우리가 봐야 하는 콘텐츠는 화면의 크기보다 더 길거나 넓을 때, 스크롤 뷰를 활용합니다. 그리고 '스크롤'이라는 행위를 할 때, 사용자에게 스크롤 뷰에서의 사용자가 보고 있는 상대적인 위치를 나타내는 UI 요소가 바로 스크롤 인디케이터(Scroll Indicator)입니다. 기본(default) 스크롤 인디케이터의 문제점 프로젝트를 진행하며, 숫자가 쌓이다가 화면을 넘어가면 스크롤 뷰가 활성화되는 기능을 넣었어요. 근데 스크롤 뷰에 기본적으로 탑재되어 있는 default 스크롤 인디케이터가 제가 만..

마지막 catch 의 역할 iOS 앱 개발을 하다보면, 발생 가능한 에러를 정의하는 열거형과 에러를 발생시킬 가능성이 있는 메서드를 만들게 됩니다. 에러를 던질 수 있는(throws) 메서드는 호출부에서 do-try-catch 문으로 처리해줄 수 있는데요, 이때 직접 정의한 에러 케이스를 전부 다루더라도, exhaustive 하지 않다는 컴파일 에러가 뜨는 경우가 있습니다. exhaustive 는 "하나도 빠뜨리는 것 없이 철저한" 이라는 뜻의 형용사인데요. 스위프트에서 switch 문을 쓰다 보면, 자주 보실 수 있는 에러죠. 위의 예시 코드처럼, do-try-catch 문에서 모든 에러 타입을 catch 로 붙잡아주더라도, 마지막에 매치되는 에러가 없는 catch 절이 필요한데요. 마지막 catch ..

[ tracking connection ] -u 옵션은 --set-upstream 의 줄임말. tracking connection 을 설정하는 옵션입니다. 이게 설정됐을 때, Remote 레포의 브랜치를 Local 레포 브랜치의 업스트림(Upstream) 브랜치 라고 부릅니다. -u 옵션을 통해 tracking connection 을 설정하면 git push/pull 과 같이 간단한 명령어로 자동으로 Remote 레포와 정보를 교환할 수 있습니다. [ git ] git add . -> working directory 내의 수정사항이 있는 모든 파일들을 staging area 에 올림 git add [디렉토리명 or 파일 이름] -> 수정사항이 있는 해당 디렉토리 또는 특정 파일을 staging area ..

앱은 하나 이상의 화면으로 이루어져 있습니다. 화면에서 다른 화면으로 이동할 수 있고, 또 되돌아올 수도 있어요. View controllers are the foundation of your app’s internal structure. Every app has at least one view controller, and most apps have several. 앱의 모든 화면은 각자의 ViewController(이하 "뷰컨"), 그리고 생명주기(Life Cycle)를 갖습니다. 화면이 메모리에 처음 올라가고(로딩), 사용자에게 시각적으로 보여지고, 그리고 다음 화면을 위해 자리를 양보하며 사라지고, 메모리에서 아예 해제되기도 하는 일련의 과정을 UIViewController Life Cycle 이라..

스위프트의 사용자 정의 타입으로는, 구조체(struct)와 클래스(class), 열거형(enum) 등이 있다. 이번 글에서는 구조체와 클래스의 공통점과 차이점에 대해 정리하고, 어떤 기준으로 둘 중에 하나를 선택해야 하는지 정리해보자! 구조체와 클래스의 공통점과 차이점 - 타입/인스턴스 프로퍼티를 가질 수 있다. - 타입/인스턴스 메서드를 가질 수 있다. - 서브스크립트 문법(subscript syntax)을 사용하여 값에 접근할 수 있다. - 초기화 상태(initial state)를 만들기 위한 이니셜라이저를 정의할 수 있다. - 기능적 확장이 가능하다. - 프로토콜을 준수할 수 있다. 여기서, 클래스는 구조체가 가지고 있지 않은 별도의 능력이 있다. - 클래스의 단일 상속이 가능하다. (구조체는 상속..

네임스페이스(NameSpace) 란? 네임스페이스는 연관된 값들을 한 공간에 이름을 지어 모아둔 공간을 말한다. 쉽게 예를 들면, 우리가 '서랍'에 물건을 보관할 때, 그 안에 뭐가 들었는지 '라벨링'하는 것과 비슷하다. 유사한 물건들을 모아둠으로써, 관리(유지보수)가 쉬워지고 재사용도 편리해진다. 네임스페이스를 통해서만 문자열에 접근할 수 있게 만드는 캡슐화(Encapsulation) 방법이기도 하다. 코딩을 할 때도 이런 네임스페이스를 잘 만들어두면, 하드코딩도 방지하고 코드 가독성도 좋아진다. 이번 글에서는, 출력을 위해 사용할 문자열(String)들을 모아두는 네임스페이스를 만든다고 가정해보자. 네임스페이스를 만드는 방법을 총 6가지로 정리해보겠다. 사실, 6가지 보다 더 다양한 방법으로 네임스페..