CAShapeLayer와 UIBezierPath를 사용하면 UIView의 모양을 자유롭게 커스터마이징할 수 있다. UIBezierPath → 곡선이나 직선을 조합해 경로(Path)를 생성하는 객체CAShapeLayer → 경로(Path)를 그릴 수 있는 레이어🔗 UIBezierPath 공식 문서 addCurve(to:controlPoint1:controlPoint2:) | Apple Developer DocumentationAppends a cubic Bézier curve to the path.developer.apple.com 🔗 CAShapeLayer 공식 문서 CAShapeLayer | Apple Developer DocumentationA layer that draws a cubic Bezi..
CoreLocation을 사용해서 현재 위치 데이터를 받아와보자 📍 1. CoreLocation 설정 (현재 위치 받아오기)CoreLocation 프레임워크를 사용해서 사용자의 위치 정보를 가져올 수 있다. ✅ Info.plist 설정 위치 권한 요청을 위한 키를 추가해야 한다.NSLocationWhenInUseUsageDescription앱 사용 중 현재 위치를 확인하기 위해 필요합니다.NSLocationAlwaysUsageDescription항상 현재 위치를 확인하기 위해 필요합니다. 2. LocationManager 클래스 생성위치 정보를 관리하는 클래스를 만들어 현재 위치를 불러오기.import CoreLocationimport Combineclass LocationManager: NSObjec..
Alamofire와 Combine의 조합으로 API 요청하는 방식을 알아보자. 1. Alamofire + Combine의 조합이란?Alamofire: 네트워크 요청을 간편하게 해주는 라이브러리.Combine: 비동기 데이터를 스트림으로 처리하는 프레임워크.이 둘을 조합하면 네트워크 요청을 더 깔끔하고 선언적으로 처리할 수 있다.즉, 네트워크 요청 → 응답 처리 → UI 업데이트 흐름이 자연스럽게 이어진다. 2. 기본적인 Alamofire + Combine 패턴Alamofire는 publishDecodable이라는 메서드를 제공해서 Combine과 쉽게 연동할 수 있다. ✅ Step 1. APIManager에서 Publisher 반환// Combine으로 API 요청 (Publisher 반환)func fe..
Combine을 통한 데이터 바인딩ViewModel에서 @Published와 sink, assign을 활용해 뷰에 데이터를 구독하고 실시간으로 UI에 반영할 수 있다. @Published, sink, assign의 사용 방법에 대해 알아보자. 1. @Published:ObservableObject 프로토콜을 채택한 클래스에서 사용.값이 변경될 때마다 뷰(구독자)에게 알림을 보내 UI를 자동으로 업데이트.@Published var temperature: Double = 0.0 2. sink(receiveCompletion:receiveValue:):퍼블리셔에서 값을 받을 때 사용하는 구독 메서드.네트워크 요청이 성공하거나 실패할 때 동작을 정의.WeatherAPIManager.shared.fetchCurr..
컬렉션뷰에서 스크롤을 이용한 페이징(Pagination)하는 방법을 정리해보자!테이블뷰와 컬렉션뷰에는 스크롤이 내장되어 있어 UIScrollDelegate를 사용할 수 있다. 원하는 뷰컨트롤러에 페이지네이션을 구현하기 위해 우선 스크롤 이벤트를 감지하는 메서드를 추가하여 사용자가 컬렉션뷰의 아래쪽에 도달했을 때 다음 페이지를 가져오도록 했다. 1. UICollectionViewDelegate - scrollViewDidScroll// MARK: - UICollectionViewDelegateextension ExerciseAlbumViewController: UICollectionViewDelegate { func scrollViewDidScroll(_ scrollView: UIScrollView)..
뷰에 애니메이션을 주기 위해 원하는 UIView의 너비를 시간이 지남에 따라 줄어들도록 구현하고 있었는데스냅킷의 제약조건에 관한 크래시가 발생했다.Updated constraint could not find existing matching constraint to update 다음과 같은 크래시가 나는 걸 확인했다. 초기 UIView의 제약조건은 다음과 같이 설정했다.progressBar.snp.makeConstraints { $0.top.leading.bottom.equalToSuperview() $0.width.equalToSuperview() }▶ 뷰의 너비를 equalToSuperview()로 설정 private func updateProgressBar() { ..
[UIKeyboardTaskQueue lockWhenReadyForMainThread] timeout waiting for task on queue시뮬레이터에서 서치바나 텍스트필드를 사용할 때 키보드가 안 뜨고 위와 같은 타임아웃 에러가 뜨는 경우가 있습니다. 시뮬레이터가 멈춰서 당황했는데 시뮬레이터에서 종종 이런 버그가 난다고 합니다..!!시간이 지나면 해결될 수도 있고 키보드 설정을 바꿔서 해결할 수도 있습니다. Simulator에서 Connect Hardware Keyboard를 선택하게 되면 내 컴퓨터의 하드웨어 키보드를 사용하게 됩니다.위처럼 I/O의 Keyboard 설정에 Connect Hardware Keyboard이 체크되어 있다면 해제합니다. Connect Hardware Keyboar..
코드베이스로 작업을 하기 위한 초기세팅을 먼저 정리해 볼게요! Storyboard 삭제 세팅1. Main.storyboard 스토리보드 파일 삭제 - > Move to Trash 메인 스토리보드를 제거해 주세요 2. Project TARGETS > Build Settings > Main Storyboard 삭제프로젝트의 타겟으로 이동해서 메인 스토리보드도 삭제해 줍니다. 3. Info.plist > Storyboard Name > Main위의 경로로 이동해서 스토리보드 키를 - 버튼 눌러서 삭제합니다. 4. SceneDelegate 수정하기⭐️⭐️이제 어떤 뷰컨트롤러로 시작할지 지정해줘야 합니다!씬델리게이트에서 scene() 메서드 안에 아래 코드로 내용을 수정해 줍니다.guard let windowS..
레이아웃을 잡을 때 가끔 헷갈릴 때가 있는데 참고하기 위한 포스팅입니다!💡Content Hugging Prioritycontent Hugging Priority "늘어나는 것에 대한 저항"→ 우선순위 높을 수록 크기 유지, 우선순위 낮으면 크기 늘어남 공간이 남으면 누가 더 늘어나야 하는지에 대한 우선순위!Hugging의 우선순위가 크다 = 내 크기를 유지하는데 더 큰 우선순위가 있다. 즉 더 우선 순위가 낮은 요소는 늘어나게 된다.이 속성은 뷰의 크기를 얼마나 확장할 것인지에 대한 우선순위를 정의하며, 우선순위가 높을수록 뷰는 크기를 늘리지 않으려고 시도한다. Horizontal Content Hugging Priority : 뷰의 가로 방향 크기 확장에 대한 우선순위Vertical Content H..
동기와 비동기에 대해 들었던 세션 내용을 더 딥하게 이해해보려 한다!동기와 비동기 개념에 대해 공부해보자✍🏻 GCD - Grand Central Dispatch 1. 쓰레드 (Thread)우선 쓰레드란..??!컴퓨터 프로그램을 실행하는데 사용되는 가장 작은 실행 단위를 의미한다. 쓰레드는 프로세스 내에서 실행되는 작은 단위의 실행 흐름이다.각각의 쓰레드는 독립적으로 실행될 수 있으며, 여러 쓰레드가 동시에 작업을 수행할 수 있다.이러한 다중 쓰레드 작업은 시스템 자원을 효율적으로 활용하고, 병렬적으로 작업을 처리할 수 있도록 도와준다! 이러한 내용이 무슨 뜻이냐!"쓰레드 👉 동시에 일을 할 수 있는 것의 단위" 정도로만 기억하면 된다. 메인 쓰레드 이외의 쓰레드가 필요한 이유는 뭘까??메인 스레드는 ..