[TIL #8] 23 / 03 / 30 오늘은 iOS 15에서 새로 도입된, UISheetPresentationController에 대해 간단히 알아보겠습니다. 참고 자료 UISheetpresentationcontroller WWDC2021 WWDC는 꼭 한번 시청해 보세요. UISheetPresentationController UISheetPresentationController를 사용하기 위해서는 modalPresentationStyle의 설정 중, 오직 pageSheet, formSheet를 사용할 때, 구현이 가능합니다. fullScreen과 같은 다른 이외의 값들은 nil 값을 갖게 돼서, 사용이 불가능합니다. UISheetPresentationController의 기능을 간단히 설명하면, Sh..
시작 이전에 이미 plist의 데이터를 갖고 오는 방법을 설명을 했었습니다. [iOS/Swift] 개발 환경에 따라 각각의 다른 plist의 저장된 API Key 값 받아오기 [iOS/Swift] plist의 값 얻는 방법 및 Github에서 중요한 정보 숨기는 방법(API Key, Bundle, gitignore) 그런데 불러오는 과정에서 NSDictionary(contentsOfFile: String)은 iOS 11 부터 더 이상 사용되지 않더라고요. 이런식으로 사용이 가능하네요. var parsePlist: NSDictionary { guard let plistUrl = Bundle.main.url(forResource: "SecureAPIKeys", withExtension: "plist") el..
[TIL #7] 23 / 03 / 27 ~ 23 / 03 / 28 자 오늘도 Mapkit을 할 건데요. 이번엔 MKAnnotationView에 관련하여 알아보겠습니다. 공식문서 예제 를 참고하여 만들었습니다. 시작 자 그러면 이제 MKAnnotationView를 상속받아 커스텀으로 AnnotationView를 만들어 보겠습니다. 타이틀과 사진을 포함한 AnnotationView을 만들어 보려고 하는데요. AnnotationView도 일종에 View라고 생각하고 만드시면 됩니다. Annotation, AnnotationView 및 처리까지 한번 직접 구현을 해봅시다. 우린 [Swift/TIL #6] MapKit을 사용해 보자 에서 직접 Annotation을 만들어봤습니다. 이번에는 이미지도 같이 사용할 것..
시작 공식문서에서 MapKit의 Annotation 예제를 살펴보던 중 @objc dynamic var라는 키워드가 나오더라고요. annotation 예제 공식문서 MKAnnotation - coordinate 공식문서 Realm에서도 이런 키워드를 봤던 거 같은데, 그래서 오늘 간단히 한번 정리해 보고 넘어가려고 글을 적게 됐습니다. 정적(static) / 동적(dynamic) 디스패치 들어가기 전에 간단히 차이섬을 알아봅시다. 👉 정적(static) 디스패치 컴파일러가 컴파일 시점에 호출해야 할, 메서드의 실제 위치를 미리 알고 있기 때문에, 매우 빠르게 동작합니다. 컴파일 타임에 결정이 되기 때문에, 상대적으로 속도 빠릅니다. 모든 구조체는 이와 같이 동작합니다. 대신 클래스에서는 상속을 못하게 되..
[TIL #6] 23 / 03 / 25 오늘은 간단하게 MapKit을 구현해보려 합니다. MapKit의 속성 및 메서드들을 정리해보려고 합니다. 지도 불러오기 객체 MKMapView를 만든 후, 레이아웃만 잡아주면 됩니다. class MapViewController: UIViewController { let mapView = MKMapView() override func viewDidLoad() { super.viewDidLoad() self.view.addSubview(mapView) mapView.snp.makeConstraints { $0.edges.equalToSuperview() } } } 속성과 메서드 너무 많아서 전체를 설명하긴 힘들고, 자주 사용하는 것들만 보여드리겠습니다. 자세한 내용은 ..
[TIL #5] 23 / 03 / 23 하... Tint... 오늘은 이미지를 불러와 버튼을 생성하는데, 이미지가 작아서 크기 변경이 필요했고, tint 컬러도 변경하려고 했습니다. 적용이 않돼서 한참 동안 싸우다가, 공부 겸 까먹지 않기 위해 이렇게 글을 쓰게 됐네요. UIGraphicsImageRenderer 간단 소개를 하자면, iOS 10부터 추가된 클래스로, Core Graphic을 통해 쉽게 이미지를 그릴 수 있는 API를 제공합니다. 자세한 내용은 공식문서 를 참고하세요. UIGraphicsImageRenderer를 통해 출력 이미지를 렌더링을 할 수 있습니다. 공식문서에 자세히 나와있지만, 간단히 사용해 봅시다. UIGraphicsImageRenderer 객체 생성 그런데 UIImage 타..
[TIL #4] 22 / 03 / 21오늘은 [Swift/TIL #3] 탭바 아이템을 버튼으로 교체 with CGAffineTransform(회전) 에서 만든,중간 add 버튼을 클릭하면, 팝 버튼이 생성되는 애니메이션을 만들어보려 합니다. 일단 아직 고쳐야 할 게 있지만, 중간 결과물을 먼저 봅시다. 오늘의 작업1. Pop 버튼 생성 준비2. Pop 버튼 생성 및 위치 설정3. 애니메이션 및 버튼 처리 고쳐야 할 일현재 만들고자 하는 건 원이 0에서 점점 커지는 애니메이션을 만들고 싶은데,버튼의 원이 먼저 생성되고 스케일이 커지는 문제점이 있네요. (수정 완료) Pop 버튼 생성 준비일단 버튼에 사용할 데이터들을 구조체로 만들어 줬습니다.// 탭바 pop 버튼에 사용할 데이터struct PopBut..
[TIL #3] 22 / 03 / 19 [Swift/TIL #2] CAShapeLayer 이용한 탭바 구현 에 이어서 오늘도 역시나 탭바 작업을 할 예정입니다. 오늘 할 작업을 정리해 보자면 1. 탭바 아이템을 버튼으로 교체 2. 버튼에 회전 애니메이션 효과를 추가 문제 탭바의 아이템 특성상 클릭하게 되면 설정해 준 ViewController를 실행하게 됩니다. 저는 단순히 버튼 기능만을 원하기 때문에 오늘은 탭바 아이템 대신에 버튼으로 대체하는 작업을 해보려고 합니다. 한번 탭바 아이템 대신 버튼으로 대체해 봅시다. 완성 미리 보기 버튼 생성 먼저 탭바 가운데 아이템 대신 사용할 버튼을 만들어 줍시다. 이미지를 생성할 때 Configuration을 사용하면 기호의 크기, 색상, 스타일 등을 설정해 줄..
[TIL #2] 23 / 03 / 17 ~ 23 / 03 / 18 앞서 배운 [Swift/TIL #1] CAShapeLayer, UIBezierPath 내용을 토대로 탭바를 구현해 봅시다. 역시 글을 쓸 땐 중간 정렬이 보기가 좋아요. (나만 그런가...) Frame & Bounds 들어가기 전에 Frame과 Bounds의 차이를 먼저 알아봅시다. 위치 및 크기의 차이가 있는데요. 한번 살펴봅시다. 그림으로 된 설명은 Zedd, 소들이 님이 잘해주셨어요. 🎯 Frame 객체의 Frame 위치는 SuperView의 좌표를 기준으로 상대적인 좌표를 나타낸 것입니다. 특징으로는 Frame을 변경 시 객체의 위치만 바뀌고, 하위 뷰(SubView)는 영향을 받지 않습니다. 다시 말해 객체는 SuperView의 ..
[TIL #1] 23 / 03 / 15 ~ 23 / 03 / 16 커스텀으로 탭바의 모양을 만드는 중에 CAShapeLayer라는 것이 갑자기 튀어나왔습니다. 코드를 복붙해서 적용하면 모양이 바뀌긴 하지만... 사용방법을 한번 알아봅시다. CAShapeLayer를 사용하려면 UIBezierPath를 생성하는 방법도 알아야 하네요... 전부 알아보도록 합시다. ㅠㅠ UIBezierPath 들어가기 앞서 CAShapeLayer는 모양을 그리는 클래스가 아니기 때문에, 도형을 만들기 위해서는 UIBezierPath를 사용해야 합니다. UIBezierPath는 여러 직선 및 곡선을 사용하여 복잡한 형상을 렌더링 할 수 있는 클래스입니다. (커스텀 뷰를 그릴 때 자주 사용 됩니다.) 공식문서 1, 공식문서 2 에..
의존관계 역전 원칙 (DPI : Dependency inversion principle) 의존관계 역전 원칙은 SOLID의 마지막 원칙으로 상위 모듈이 하위 모듈에게 의존하지 않도록 설계하는 겁니다. 즉, 상위 모듈과 하위 모듈 모두 추상화를 통해 간접적으로 의존하게 만들어야 합니다. 또한, 추상화는 세부 사항(변수, 메서드 등)에 의존해서는 안된다. 세부사항이 추상화를 의존해야 합니다. 참고. 상위, 하위 모듈은 개념적인 용어로 표현하자면, 상위 모듈은 다른 모듈에서 의존하는 모듈을 말합니다. (다른 모듈을 사용하는 모듈) 반면, 하위 모듈은 다른 모듈에 의존되는 모듈을 말합니다. (세부 구현 및 일부 기능을 제공하는 모듈) 의존성(Dependency)이란? 한 객체가 다른 객체에 의존하는 것을 의미합..
Subject Subject들은 특별하게도 Observable로서 데이터를 방출도 하면서, Observer로서 데이터를 구독할 수도 있습니다. 이러한 특징으로, Subject는 Observable이 방출하는 데이터의 흐름을 제어할 수 있는 장점이 있습니다. (예를 들어 Observable이 각각의 이벤트를 방출할 때마다 UI 업데이트하게 되면, 성능이 저하될 수도 있습니다. 특정 조건에만 구현되도록 처리해 주면 이러한 단점을 해결할 수 있습니다.) 또한 여러 Observer들이 서로 데이터를 공유할 수 있습니다. 즉, Hot Observable과 같이 동작하죠. 참고로 Subject들도 Observable과 마찬가지로 Disposable을 리턴합니다. 즉, 일회성을 갖고 있다는 것이죠. (Complete..
Hot & Cold Observable Hot Observable 구독 여부와 상관없이 이벤트를 발생시킨다. (구독하기 전부터 이미 element 방출) 즉, Observable의 이벤트 스트림은 이미 진행 중이고 구독(subscibe)하는 시점부터 이벤트를 통해 element를 방출합니다. 스트림(stream) : Observable이 방출하는 데이터 흐름 특징으로는 1. 여러 Observer들이 Observable 이벤트를 공유합니다. 2. 구독 이전 시점의 이벤트는 받을 수 없습니다. 대표적으로 Hot Observable을 사용하는 방법은 Subject가 있습니다. Cold Observable 구독하기 전까지 아무런 이벤트도 발생하지 않는다. (구독 시 element 방출) 구독(subscibe)을..
Traits Observable이 파생된 형태로 create시 제한적인 이벤트를 사용하고 하고 싶을 때 사용합니다. 간단히 말해 Observable 생성 시 이벤트 onNext, onError, onCompleted를 모두 처리하는 것이 아니라 필요한 이벤트만 사용함. Traits도 엄연히 Observable이고 Traits을 통해 필요한 이벤트만 사용하여 코드를 조금 더 직관적이고 의도를 명확하게 해 주도록 도와줍니다. 종류 RxSwift에는 Single, Completable, Mabye RxCocoa는 Driver, Signal 오늘은 RxSwift의 Single, Completable, Mabye만 알아보겠습니다. Traits의 구현은 각각의 PrimitiveSequence의 create를 통해 ..
Observable의 연산자 Observable 관련 연산자의 종류는 이와 같습니다. 생성 관련 연산자 just, of, from, range, create 제거 관련 연산자 empty, never, disposable 지연 관련 연산자 deferred 생성 관련 연산자 생성 관련 연산자 just, of, from, range, create에 대하여 알아봅시다. 들어가기 앞서 RxSwift 사용방법을 모르시는 분은 [iOS/RxSwift] Observable, Subscribe 개념 및 사용 방법을 참고해 주세요 just 오직 하나의 Observable sequence만을 생성 및 방출 let justObservable = Observable.just("Hello World") justObservable..