본문 바로가기

ios

(18)
[iOS] Swift 참조 타입이 앱 기동 시간에 안 좋은 영향을 끼치는 이유 (번역) 앱 기동(launch) 경험은 앱 사용자에 대한 첫 인상입니다. 앱이 시작될 때까지 기다리는 시간은 수치상으로는 짧지만 실제로 짧게 느껴지지 않을 수 있는 중요한 시간입니다. 해당 앱을 하루에 여러번 사용되는 경우 사용자는 앱 기동을 계속해서 기다려야 합니다. Apple은 첫 번째 프레임을 400ms 미만으로 그릴 것을 권장합니다. 이렇게 하면 Springboard의 앱 열기 애니메이션이 완료 될 때 앱을 사용할 수 있습니다. 400ms 시간 내에서 개발자는 실수로 앱 시작 시간을 늘리지 않도록 유의해야 합니다. 그러나 앱 기동은 하는 일이 너무 많아서 정확히 어떤 것이 기동 시간을 늘리는지 알기가 어렵습니다. Swift 참조 유형이 바이너리 크기와 느려진 앱 시작 시간에 어떻게 영향을 미치는지 알아보도..
[iOS] DispatchSourceTimer로 일시정지 구현이 쉬운 타이머 만들기 스택오버플로우에 일시정지와 재시작이 가능한 Timer를 구현하는 방법에 대한 질문에 Timer를 invalidate 시켰다가 새로운 Timer를 할당하는 등의 까다로운 방법들로만 답변이 달린 것을 보았습니다. 내가 본 질문과 답변들.. Pausing and Resuming a Timer in iOS Swift : Pause and Resume NSTimer 만약 DispatchSourceTimer를 알고 있더라면 좀 더 쉽게 해결가능한 문제입니다. 1초마다 시간을 출력해야 한다면 아래처럼 Timer를 만들 수 있습니다. var timer: DispatchSourceTimer? if timer == nil { // 1 timer = DispatchSource.makeTimerSource(flags: [],..
[iOS] 클래스의 모든 프로퍼티들이 궁금할 땐? 디버깅을 하다보면 특정 인스턴스에 어떤 프로퍼티들이 어떤 값들로 할당되어 있는지 로그로 남겨 한 눈에 보고싶을 때가 있습니다. 이 때 사용하면 유용한 방법을 공유하도록 하겠습니다! extension NSObject { func properties() -> [String] { var results: [String] = [] var count: UInt32 = 0 let myClass: AnyClass = self.classForCoder // 프로퍼티들 리스트 조회 let properties = class_copyPropertyList(myClass, &count) for index in 0..
[iOS] NSPredicate 문법 정리 NSArray를 필터링 할 때, CoreData를 사용할 때 Predicate 문법을 사용하여 필터링 하곤 합니다. 이 때 주로 사용하는 문법들을 정리해보겠습니다. let request: NSFetchRequest = Entity.fetchRequest() let predicate = NSPredicate(format: "id == %@", id) request.predicate = predicate CoreData에서 데이터 조회(fetch)할 때 사용하는 방식은 대부분 위와 같을 것 입니다. NSPredicate 생성자 중 format 문자열에 검색조건을 지정하는 방법을 주로 사용합니다. format 문자열은 대소문자를 구별하지 않습니다. Predicate Keyword 들은 대문자로 작성하는 것이 ..
[iOS] fullScreen? overFullScreen? over가 붙으면 무엇이 다를까 (UIModalPresentationStyle) UIViewController의 속성중에 modalPresentationStyle 란 것이 있습니다. 해당 뷰컨트롤러가 모달 형식으로 띄워질 때의 스타일을 지정할 수 있는 것이죠. var modalPresentationStyle: UIModalPresentationStyle { get set } 스타일로 지정할 수 있는 타입의 기본값은 .automatic 이고 지정할 수 있는 값은 총 11가지가 있습니다. 이 중에서 .fullScreen과 .overFullScreen, .currentContext와 .overCurrentContext 처럼 prefix로 over가 붙으면 어떤 차이가 있는지 알아보려고 합니다! 정의를 먼저 살펴보면, 차이점은 presentation style 과 view presentat..
[iOS] 로컬 푸쉬 알림 구현 방법 (Local Notification) Swift로 로컬에서 푸쉬 알림을 어떻게 띄우게 구현하는지 알아보도록 하겠습니다. 기본 구조 Local Notification은 크게 3가지 파트로 나뉩니다. content, trigger, request 입니다. 이 세가지를 통하여 Local Notification을 쉽게 구현할 수 있습니다. Content content는 사용자에게 어떤 내용을 보여줄지에 대한 정보를 담고 있습니다. title, body, badge number, userInfo, attachments 등이 있습니다. userInfo는 예상하다시피 원하는 정보를 모두 담을 수 있는 Dictionary 입니다. 알림을 사용자가 눌렀을 때, userInfo에 들어있는 정보를 접근하여 활용할 수 있습니다. Trigger trigger에는 ..
[iOS] 웹뷰에서 숫자 키패드로 뜨지 않을 경우 해결방법 웹뷰(WebView)에서 아래와 같이 input 태그를 작성했음에도 기대했던 숫자 키패드(Number Keypad)가 뜨지 않을 경우가 있었다. 특이한 점은 iOS 13에서는 잘 동작하였지만 iOS 12에서 발생하는 것으로 확인되었다. 원인은 iOS 12.2 부터 inputmode를 지원한다는 것이다. inputmode에 decimal을 명시하면 iOS 12.2 부터는 decimalPad가 뜨게 된다. 하지만 그 아래 버전에서는 decimalPad가 뜨지 않았다. 대체할 해결 방법은 의외로 간단했다. 방법을 찾는 것이 어렵... pattern attribute를 지정함으로써 해결할 수 있었다. "[0-9]*" 와 "\d*" 두 패턴 모두 잘 동작하는 것을 확인하였고 둘 중에 원하는대로 사용하면 문제가 없..
[iOS] Keyframe Animation으로 애니메이션 구현하는 방법 순차적으로 애니메이션이 실행되어야 한다면 아래와 같이 UIView Animation 을 중첩하여 구현할 수 있습니다. UIView.animate(withDuration: 1.0, animations: { self.animate1() }, completion: { finished in UIView.animate(withDuration: 1.0, animations: { self.animate2() }, completion: { finished in UIView.animate(withDuration: 1.0, animations: { self.animate3() }) }) }) 중첩이 많아 가독성이 떨어져 보입니다. 애니메이션이 추가될 수록 더 악화될 것입니다. 이 코드는 아래처럼 animateKeyfram..