코드로 Navigation 영역 수정을 반복하다가 알게 된 사실 .. 원래는 Navigation Back 버튼을 통해 화면을 전환했다가 돌아오면, 해당 버튼이 보이지 않는 현상때문에 수정을 하려고 했었는데, 이를 수정하다 우연히 필요했던 구현을 하게 되었다. Navigation Back Button A 화면에서 Navigation 버튼을 통해 B 화면으로 전환했을 때, B화면에서 다시 A 화면으로 돌아가는 Navigation 영역의 Back 버튼을 컨트롤러의 타이틀은 보이지 않고, 화살표 모양만 보이게 하고 싶었다. 일단 뒤로가는버튼이 사라지는 현상의 원인 네비게이션 바의 스타일과 버튼 속성이 정확하게 설정되어있는지 확인해야 했다. 그래서 다음과 같은 코드를 사용해서 네비게이션 바의 스타일과 버튼 속성을..
📌 GCD ( Grand Central Dispatch) 란? 다수의 Thread에 적절하게 작업을 분배하기 위해 해야 할 일은 무엇일까 ? 바로 할 일(task)를 Queue에 넣는 것이다. 넣어야 되는 것이라면 다수의 Thread에 적절하게 작업을 분배하는 일은 누가 할 것인가 ? 바로 GCD는 Queue에 넣으면 그에 따른 스레드를 적절하게 생성해 분배해주는 첫번째 방법이다. 그리고 GCD에서 사용하는 Queue 이름이 Dispatch Queue이다. 그럼 Dispatch Queue에 작업이 추가되면 GCD는 작업에 맞는 스레드를 자동으로 생성해서 실행하고, 작업이 종료되면 스레드를 제거하게 된다. 📌 Dispatch Queue란? 앱의 메인 스레드나 백그라운드 스레드에서 순차적으로 또는 동시에 작..
QoS ( Quality of Service ) QoS는 서비스의 품질이다. DispatchQueue의 작업을 우선적으로 분류하는데 도움을 준다. 개발자는 중요도에 따라 앱 작업을 분류해 시스템의 우선 순위를 보다 효과적으로 지정할 수 있다. 최적의 시간까지 작업을 연기하는 것과 비슷하게 다른 효율성 처리를 구현한 경우에도 시스템은 여전히 일정 수준의 우선순위를 수행해야 한다. 그렇기 때문에 앱이 수행하는 작업을 분류하는 것은 중요하다. QoS의 class 정보 서비스 품질(QoS) 클래스를 사용하면 수행할 작업을 NSOperation, NSOperationQueue, NSThread개체, 디스패치 대기열 및 pthread(POSIX 스레드)로 분류할 수 있다. 작업에 QoS를 할당하여 중요도를 표시하면..
SnapKit SnapKit을 사용해보면서 헷갈렸던 부분 정리 - offset/inset - translateAutoresizingMaskIntoContraints 📌 offset / inset 💡offset 사용시 '현재 뷰 constraint = 슈퍼뷰 constraint + offset 값'을 생각하고 설정한다. label.snp.makeConstraints { make in make.top.equalToSuperview().offset(50) make.left.equalToSuperview().offset(50) make.right.equalToSuperview().offset(-50) make.bottom.equalToSuperview().offset(-50) } 기준이 되는 View에 맞춰서 ..
프로토콜 지향 프로그래밍 Protocol - Oriented Programming 프로토콜 지향 프로그래밍 흔히 알고 있는 객체 지향 프로그래밍 : 사물을 객체로 형성하여 공통점을 갖는 모든 곳에서 상속받는 객체 내부의 모든 로직을 캡슐화한다. 의도 하지 않아도 상속했다는 이유로 모든 속성과 행위를 공유해야하며, 복잡한 상속 구조를 지닌 클래스를 상속했다면 원하는 클래스를 참조해야 할 때 다운캐스팅을 해야 한다. 또한 큰 단점은 단 하나의 SuperClass만 상속할 수 있다는 점이다. 시간이 흐르면 기능도 확장하기 마련이므로 복잡도도 높아지고 관리도 어려워진다. 프로토콜 지향 프로그래밍 : 필요한 부분만 프로토콜로 분리해서 만들 수 있고 다중 프로토콜을 구현할 수 있다. 게다가 프로토콜 규칙을 clas..
제네릭 제네릭이란 ? 타입에 의존하지 않는 범용 코드를 작성 할 때마다 사용한다. 제네릭을 사용하면 중복을 피하고, 코드를 유연하게 작성할 수 있다. Apple에 의하면 Swift에서 가장 강력한 기능중 하나이며, Swift 표준 라이브러리의 대다수는 제네릭으로 선언되어 있다. 예를 들어 Array, Dictionary 또한 제네릭타입이다. 제네릭 함수 두개의 인자를 받아 Int타입의 값을 swap하는 함수를 구현한다면, func swapTwoInts(_ a: inout Int, _ b: inout Int) { let tempA = a a = b b = tempA } 이렇게 구현한다. 파라미터가 모두 Int형 일경우엔 잘 돌아가는 코드이다. 하지만 만약에 파라미터 값이 Double, String일 경우엔..
자주 발생하는 iOS 앱 심사 리젝 사유 1. 소셜 로그인 기능 적용 시 애플 로그인 적용 카카오 로그인같은 SNS 로그인기능이 앱에 들어간다면 애플 로그인도 같이 구현 할 것 ex) firebase Auth로 간단한 이메일 로그인 구현시 애플 로그인 구현 필요 X 2. 타 플랫폼 문구나 아이콘 사용 금지 iOS 앱에 구글이라는 단어나 구글 플레이스토어 등의 컨텐츠가 있다면 리젝사유가 된다. 예를 들면 이벤트 팝업으로 구글 플레이 스토어 링크나 안드로이드 앱 출시 완료 같은 문구를 띄어준다면 리젝사유다. 3. 구현되지 않은 기능, 앱 버그 ( 튕김 ) 구현되지 않는 기능을 넣어도 리젝사유이다. 예를 들어 사진 촬영 버튼이 있는데 해당 버튼을 눌러도 아무 반응을 하지 않으면 리젝 사유가 된다. 그리고 앱이..
📌 Shadow & cornerRadius 일반적으로 Shadow랑 Radius를 같이하면 적용이 안되는데, Cell은 쉽게 구현이 가능하다. func setUpLayout() { layer.shadowColor = UIColor.black.cgColor layer.shadowOpacity = 0.5 layer.shadowRadius = 10 contentView.layer.cornerRadius = 10 contentView.layer.masksToBounds = true } Cell 안에서 Layout 할 때 이렇게 Cell에 Shadow를 넣고 corner Radius를 적용해주면 된다. 💡 CollectionView Cell에 테두리 둥근효과만 적용 💡 Button이나 View의 테두리 둥글게 l..