목록개발/iOS (22)
Stacking Fire
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 - 어떤 컨피겨레이션과 어떤 타겟을 통해 빌드할 것인지를 나타내는 설계도. 왜 필요한가? 웹 서비스와 연동하는 클라이언트는 일상적으로 연동 테스트를 수행합니다. 서버 사이드도 개발(테스트+디버그) 용의 서버를 따로 만들게 되고, 클라이언트의 경우 최초에 개발 서버와 먼저 테스트한 후, 실 서버에 내용이 반영되면 실 서버와도 테스트를 해야 합니다. 모든 테스트가 완료되어야 출시가 ..
회사에서 결제 페이지를 만들 때, 네비게이션 바에 화면 전환에 대한 프로그래스를 넣어달라는 요청이 있었습니다. 기본 네비바에서는 화면 전환 때문에 불가능하니 커스텀 네비바를 쓰고 여러 페이지에 있는 뷰를 하나의 뷰 컨트롤러에서 관리하도록 바꾸었습니다. 그렇게 하고 나니 화면 가장자리에서 스와이프해서 팝하는 기능을 쓸 수가 없더라구요. 그래서 기본 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 { // 아니면 이런 행동을 해라. } *의 의미 원래 플랫폼 여러 개에 대해서 예외처리를 해주는 코드이기 때문에, 아래처럼 다른 플랫폼을 추가해 줄 수 있습니다. 마지막의 *는, ..
UIView에는 animate(withDuration:animations:completion:)라는 애니메이션 메서드가 있습니다. 프레임(frame) 베이스의 앱에서는 아주 직관적이고 편리한 메서드입니다. 하지만 오토 레이아웃을 쓰게 되면 좀 혼란스러워지죠. 프레임처럼 단순히 값만 바꿔주는 걸로는 작동하지 않습니다. 애초에 프레임 값의 변화를 캐치해서 애니메이션으로 만들어 주는 메서드이기 때문입니다. 찾아보면 슈퍼뷰(superview)에 layoutIfNeeded()를 사용하면 된다고 하는데, 모든 서브뷰를 다시 레이아웃하는 메서드인 만큼 부작용이 따를 수 있습니다. 게다가 뷰의 레이아웃 뿐만 아니라 컬러라든가 컨텐츠 등을 업데이트하는 것도 같은 타이밍에 애니메이션되어야 한다면 머리가 좀 아파집니다. 관..
이니페이 모바일(INIPay Mobile)은 이니시스(INICIS)의 서비스 중 하나로, 앱 내에서 웹뷰를 이용해 결제 서비스를 제공할 수 있도록 하는데요. 직접 iOS에 붙이면서 배운 점을 정리해 보았습니다. 언어는 Swift 4.0입니다. 주의할 쿼리, P_RESERVED 앱 내에서 웹뷰를 띄울 때를 위한 대부분의 설정은 여기서 해 줍니다. 그런데 P_RESERVED는 '복합 필드'라고 해서, P_라는 프리픽스가 붙는 쿼리들과 섞여서 요청되게 되는데 그 값에 문자열 &이나 = 들어가야만 합니다. INIPay 문서 쪽에는 이 처리를 위한 iOS 가이드가 없습니다. 따라서 캐릭터셋 중에 .alphanumerics이라는 놈을 이용하여 퍼센트인코딩을 해 주었습니다. 일단 잘 동작하긴 하지만, 테스트를 많이 ..
앱 개발을 하게 되면 보통 UI 디자인은 Sketch로 하게 됩니다.그리고 그 디자인을 제플린이나 여타 툴로 받아서 구현하게 되는데요. 제플린은 정말 좋은 툴이라 텍스트에 필요한 여러 옵션을 읽어서 글꼴 프리셋을 만들어 주기도 합니다. 하지만 늘 그렇듯 자동화라는 게 스스로 짜놓은 것만 못하고, 또 어쩌다가 실수로 0.1만 틀려진 설정도 다 다른 설정으로 받아들입니다. 그렇다고 안 쓰자니, Sketch에서는 버튼 한 두개로 바꿀 수 있는 설정이 개발에서는 그리 간단히 되질 않습니다. 그래서 스케치에서 할 수 있는 글꼴 설정의 (거의) 모든 걸 지원할 수 있는 익스텐션을 만들었습니다. Code extension String { enum AttributePreset { case body case headli..