목록개발 (43)
Stacking Fire
3월 중순 쯤부터 준비한 일기장 앱이 앱 스토어에 올라갔습니다. 겉으로 보기에는 단순해 보이지만 부족한 탓에 고생한 게 많았어요ㅜㅠ 배운 점, 느낀 점들을 정리해 보고자 합니다. 다운로드 Diary - Record Repeater for iOS Diary - Record Repeater for macOS 언어/플랫폼 Swift 4.1 iOS 10.0+ / macOS 10.12+ 특징 iOS / macOS 기기 간 데이터 동기화 (CloudKit): 로컬 캐싱(NSCoding)한 정보를 버전별로 변화한 데이터만 선별적으로 패치. iOS에서의 Push Notification을 통한 백그라운드 패치 적용 iPhone / iPad를 동시에 지원하는 Universal 앱. (UISplitViewController..
UIViewController를 코드로만 만들 때 기초적인 내용들이지만, 처음부터 스토리보드로 코드를 배우다 보니 몰랐던 것들을 정리해 봅니다. loadView() 문서 view 프로퍼티가 아직 nil일 때 불립니다. IB를 사용한다면 재정의해서는 안 됩니다(must not). view를 수동으로 만들고자 할 때 재정의할 수 있습니다. (하지 않아도 됩니다... 만 viewDidLoad에서 설정을 해주어야 합니다.) 재정의할 때, 'super'를 불러선 안 됩니다(should not). 그 외의 초기화를 하고 싶다면 viewDidLoad()에서 하세요. viewDidLoad() 문서 초기화를 합니다. 루트뷰 이외의 것들에 대한 초기화를 합니다. viewWillLayoutSubviews() ..
2017년 8월에 들어간 THERE에서 2018년 2월에 나오게 되었고, 새 버전 네이티브 iOS 코드에서 손을 놓아야만 했다. 회사를 나오게 된 것도 아쉽지만, 작업을 끝맺지 못한 게 더 아쉽다. 특히 THERE이라는 회사에 꼭 필요한 기능이라고 생각해서 만든 'Processor' 클래스를 제대로 써보지 못한 것이 아쉽다. 미래의 나 혹은 미래의 THERE 개발자를 위해, Processor에 대해 간단히 써 두고자 한다. (아래의 내용은 작성당시 아직 개발중인 THERE iOS 4.0 버전의 내부 커스텀 API에 대한 설명입니다만 순수하게 iOS 프론트엔드 개발에 관한 내용이며, THERE 서비스에 대한 기술적인 내용을 포함하지 않습니다.) THERE은 서로 다른 시스템을 가진 투어 및 액티비티 제공사..
CocoaCast라는 사이트의 Switching Environments With Configurations라는 포스트를 참고하여 개발환경을 세팅해봤는데요. 관련해서 핵심이 되는 사항을 정리했습니다. 용어 정리 Configuration - 빌드 세팅의 집합체. 기본적으로 Debug와 Release 두 가지가 제공된다. Scheme - 어떤 컨피겨레이션과 어떤 타겟을 통해 빌드할 것인지를 나타내는 설계도. 왜 필요한가? 웹 서비스와 연동하는 클라이언트는 일상적으로 연동 테스트를 수행합니다. 서버 사이드도 개발(테스트+디버그) 용의 서버를 따로 만들게 되고, 클라이언트의 경우 최초에 개발 서버와 먼저 테스트한 후, 실 서버에 내용이 반영되면 실 서버와도 테스트를 해야 합니다. 모든 테스트가 완료되어야 출시가 ..
(2018년 1월 23일, 내용 업데이트) 소개 Lintlint는 컴퓨터 프로그래밍에서 의심스럽거나, 에러를 발생하기 쉬운 코드에 표시(flag)를 달아 놓는 것을 말한다. 원래는 C 언어에서 사용하던 용어였으나 지금은 다른 언어에서도 일반적으로 사용된다. 위키백과, 우리 모두의 백과사전. 이름에서도 짐작하실 수 있는 것처럼, Swift용의 Lint를 SwiftLint라고 합니다. Xcode는 그 자체로도 어느 정도는 걸러내 줍니다만, 스타일까지는 터치하지 않습니다. SwiftLint는 거기서 한 걸음 더 나가서 빡세게 스타일까지 검사합니다. 심지어 공백을 한 칸 이상 띄우는 행동이나 한 파일이 500줄이 넘어가면 다시 생각해보라는 식입니다. 적용례 아래와 같은, 여기저기 조금 어색하지만 굳이 XCode..
(스스로 돌아보는 용도이기에, 평소 포스팅과 어투가 다릅니다.) 2017년은 내가 개발자가 되기로 마음먹고 처음으로 공부를 시작한 해다. 목표는 연말까지 취업! 이었는데, 다행히도 목표는 이루었지만 요즘은 하면 할 수록 갈 길이 참 멀구나. 하고 느낀다. 1월 ~ 4월 패스트캠퍼스에서 처음으로 공부를 시작했다. 당시는 Objective-C로 진행되었다. 언어의 이름부터가 'Objective'. 객체지향이 최대한 손에 익게 하는 것을 목표로 달렸다. 이제까지 내 인생에서 최고로 열심히 살았던 기간. 이제 생각하면 정말 토이같은 'Soobook'과 '혼술집', '포켓몬 도감'을 만들었다. 이때의 작업은 이곳의 Objective-C 와 UIKit 관련 내용이다. 5월 ~ 7월 같은 강의에서 조교로 일을 했다...
회사에서 결제 페이지를 만들 때, 네비게이션 바에 화면 전환에 대한 프로그래스를 넣어달라는 요청이 있었습니다. 기본 네비바에서는 화면 전환 때문에 불가능하니 커스텀 네비바를 쓰고 여러 페이지에 있는 뷰를 하나의 뷰 컨트롤러에서 관리하도록 바꾸었습니다. 그렇게 하고 나니 화면 가장자리에서 스와이프해서 팝하는 기능을 쓸 수가 없더라구요. 그래서 기본 UINavigationController가 하는 행동을 따라 직접 만들어 넣어 주었습니다. 예제 파일에는 최근 정말 재밌게 본 드라마의 세 배우를 넣어 보았습니다ㅎㅎ 팬심이라고 이해해 주시고, 만약 문제가 된다면 빼도록 하겠습니다. 결과물 환경 iOS 9.0 + Swift 4.0 SnapKit (GitHub) FlameKit (Github) Code 예제 파일:..
요즘 부쩍, 예전에 공부하면서 몰랐던 API들을 알게 됩니다. 괜히 어렵게 처리하고, 심지어는 학원 조교 시절에는 안답시고 대답하고 설명까지 했던 것들을... 이제 보니 아주 간단하게 할 수 있었던 것들을 어렵게 생각하고 있었더라구요. 이런 것이 보일 때마다 어디 숨고 싶네요. 나는 API를 제대로 보지도 않은 채 무조건 임기응변을 쓰거나 커스텀부터 하려 한 것은 아닐까 하는 생각도 들구요. 앞으로 이런 것들이 적당히 쌓일 때마다 포스팅을 해 놓으려고 합니다. UIStackView의 layoutMargins UIEdgeInsets를 넣으면 스택뷰 내부의 정렬된 뷰들로부터 마진을 잡아 줍니다. stackView.isLayoutMarginsRelativeArrangement = true stackView.l..
회사 앱에 사용하기 위해 간단한 커스텀 인디케이터를 만들어 보았습니다. 결과물 환경 iOS 9.0 + Swift 4.0 SnapKit 개요 UIScrollViewdelegate의 scrollViewDidScroll(_:)을 이용하면, 스크롤되는 도중의 모든 contentOffset을 감시할 수 있습니다. 그 모든 타이밍에 페이지 인디케이터를 업데이트해주면, 나머지는 알아서 애니메이션처럼 보입니다. (이미 충분히 세부적인 contentOffset의 변화를 캐치할 수 있기 때문에, 애니메이션 함수는 필요가 없습니다.) Code scrollViewDidScroll(_:) 현재의 포지션을 전체 페이지 대비해서 계산합니다. 예를 들어 0.7라는 숫자는 0번 뷰에서 1번 뷰까지 70% 스크롤된 상태란 뜻입니다. (..
iOS는 매년 새로운 API를 출시하는가 하면, 예전에 있던 API를 제거하기도 합니다. 하지만 상용 앱을 만드는 입장에서 타겟은 늘 정해져 있죠. iOS의 장점 중 하나가 프래그멘테이션 최소화를 통해 강력한 새 기능들을 최대한 많은 사람들에게 제공한다는 데 있기 때문에, 새 기능을 도입하는 것은 필수적입니다. 그러면서 하위호환도 생각해주기 위해, #available을 이용해서 분기 처리를 해 줍니다. 사용 방법 if #available(iOS 10.0, *) { // iOS 10.0 이상이라면 이런 행동을 해라 } else { // 아니면 이런 행동을 해라. } *의 의미 원래 플랫폼 여러 개에 대해서 예외처리를 해주는 코드이기 때문에, 아래처럼 다른 플랫폼을 추가해 줄 수 있습니다. 마지막의 *는, ..