| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- custom navigation bar
- swift bottomsheet
- identifiable
- SWIFT
- uikit toast
- swift associated type
- OAtuh 2.0
- swift dashed line
- swift 백준
- swift 점선
- reactorkit
- 버튼 피드백
- task cancellation
- UIKit
- swift concurrency
- coordinator
- BFS
- swift existential type
- Tuist
- custom ui
- swift opaque type
- button configuration
- RxSwift
- swift custom ui
- scene delegate
- swift navigationcontroller
- custombottomsheet
- 드롭다운 버튼
- task cancel
- DP
- Today
- Total
목록분류 전체보기 (89)
김경록의 앱 개발 여정
개요https://roks-apps.tistory.com/88이전 포스팅에서 UIPopover + UITableView로 드롭다운 버튼을 만들었다가, 드롭다운이 펼쳐진 상태에서 좌측 엣지 스와이프(인터랙티브 뒤로가기) 를 하면 화면이 얼어붙는 이슈가 생겼다 - 드롭다운을 연 상태에서 뒤로가기 제스쳐를 할 경우 네비게이션 타이틀만 바뀌고 화면이 멈추는 버그증상드롭다운 버튼 탭 → 팝오버로 드롭다운 표시드롭다운이 열린 상태에서 좌측 엣지 스와이프로 뒤로가기 제스처 시작네비게이션 바 타이틀은 바뀌지만 뷰는 그대로, 터치도 먹지 않는 상태 발생원인원인 추적은 금방 가능했다 아마 화면 전환에서 문제가 생긴듯했다.presentedViewController(팝오버)가 떠 있는 동안 UINavigationControl..
개요신규 프로젝트에서 사유 선택을 위한 드롭다운 버튼이 필요했다.드롭다운 버튼이라는 게 사실 앱보다는 웹 환경에서 더 자주 쓰이는 UI 같지만,이번 프로젝트의 디자인은 웹 UI를 앱에 맞게 리디자인하는 과정이었기 때문에가능한 한 동기화를 시키려고 했다.처음 해보는 작업이라 구글링을 해봤는데, 대부분 서드파티 라이브러리를 이용해서 해결하고 있었다.하지만 이번 프로젝트는 SnapKit 외에는 서드파티를 쓰지 않는 것을 희망해서 배제하기로 했다우선 가장 간단해 보이는 방법을 찾았고, iOS 기본 컴포넌트인 UIMenu로 구현을 시작했다.UIMenu가 뭐지?UIMenu는 버튼을 탭 했을 때 메뉴 리스트를 보여주는 iOS 기본 컴포넌트다.iOS 14 이후부터는 버튼과 쉽게 결합할 수 있도록 API가 강화되어서,옵..
개요최근 스위프트 오픈 카톡방에서 '애플 로그인을 구현할때 서버가 필요한가요?' 라는 질문을 봤습니다.사실 이 질문은 단순히 기능 구현의 문제가 아니라, 소셜 로그인 방식의 작동 원리와 보안 구조를 제대로 이해하고 있는지를 보여주는 중요한 질문입니다. 소셜 로그인은 OAuth2.0 으로 지원된다.소셜 로그인(Google, naver, kakao 등)은 보통 OAuth 2.0으로 제공됩니다.OAuth는 무엇일까요?OAuth는 사용자가 아이디와 비밀번호를 직접 입력하지 않고도, 제 3의 앱이나 서비스가 권한 있는 방식으로 사용자 정보를 얻을 수 있도록 허용하는 표준 프로토콜 입니다.예를 들어 우리가 어떤 앱에서 Apple로 로그인을 누르면 Apple은 인증을 수행한 뒤 Auth를 사용하는 서비스(이하 '앱'..
Swift는 타입 안정성이 아주 강력한 언어입니다.특히 타입 추상화(type abstraction)와 관련된 기능들이 다양해서,제대로 활용하면 코드의 유연성과 재사용성이 크게 높아지죠.오늘은 그중에서도 뭔가 비슷한 것 같으면서도 분명히 다른 네 가지 기능을 정리해보려고 합니다:연관 타입 (associatedtype)제네릭 (Generic)불명확 타입 (Opaque Type)실존 타입 (Existential Type)어디에 어떻게 써야 할지, 어떤 차이가 있는지 살펴보고 그래서 '이게 왜 존재해야하는가'에 대해 개인적인 생각을 담아봤습니다.💡 한글 용어는 야곰님의 『스위프트 프로그래밍 4판』을 기준으로 사용했습니다.1. 🧩 연관 타입 (associatedtype) — 프로토콜 내부에서의 타입 추상화📌..
📢 cornerRadius란?cornerRadius는 iOS의 모든 UIView가 갖고 있는 CALayer의 속성 중 하나로, 뷰의 모서리를 둥글게 만들어줍니다. 숫자로 지정한 반지름(radius)만큼 모서리가 잘려 둥근 사각형 형태로 렌더링되죠. 예를 들어, 버튼이나 카드 뷰에 부드러운 곡선을 주고 싶을 때 유용합니다.let roundedImageView: UIImageView = { let imageView = UIImageView() imageView.backgroundColor = .systemBlue imageView.layer.cornerRadius = 12 // 모서리를 12pt 만큼 둥글게 imageView.clipsToBounds = true // 내부 콘텐츠가 ..
iOS 앱 개발자라면 누구나 익숙한 AppDelegate 방식. 앱 생명주기의 중심이었죠.그런데 이제는… Apple이 SceneDelegate를 강제하려고 합니다.정말 AppDelegate는 사라지는 걸까요?그리고 우리는 지금 무엇을 준비해야 할까요?🌀 SceneDelegate가 뭐길래?iOS 13부터 도입된 Scene 기반 Life Cycle은 앱을 하나 이상의 "Scene"으로 나누어 관리할 수 있게 해줍니다.간단히 말하면, 앱의 UI 상태를 독립적으로 관리할 수 있는 구조죠.예를 들어 iPad에서 여러 개의 앱 창(윈도우)을 동시에 띄울 수 있는 것도 Scene 구조 덕분입니다.🔥 그런데 왜 지금 이렇게 중요한가?Apple은 iOS 18.4부터 다음 조건을 강제합니다✅ Info.plist에 UI..
🔊 개요앱을 만들 때 Button은 필수적이고, 자동으로 터치 피드백을 제공합니다.(눌렸을 때 색깔이 바뀐다던가)하지만 종종 버튼을 눌렀을 때 아무런 반응이 없는 것처럼 보이는 문제를 겪게 되죠.그럴 땐 대부분 아래 이유 중 하나입니다.👇 1. AttributedString에서 색상을 직접 지정한 경우(configuraton 사용 시)configuration 사용 시 폰트를 지정할 때 AttriibutedString을 사용하게 됩니다.그때 foregroundColor 또한 지정이 가능하며 이것으로 글자색을 바꿀 수도 있습니다. let attributedTitle = AttributedString( "이미지", attributes: AttributeContainer([ .font..
✅ 구조적 동시성과 작업 취소구조적 동시성이란?부모 Task가 종료되기 전까지, 그 아래에서 생성된 자식 Task들도 모두 종료되어야 하는 규칙Swift의 async let, withTaskGroup 이 대표적인 구조적 동시성 도구취소는 위에서 아래로 전파됨 (부모 → 자식)즉, 부모가 취소되면, 구조적으로 연결된 자식들도 자동으로 취소됨구조적 동시성에 관한 이전 글 ) https://roks-apps.tistory.com/76 ✅ async let의 작업 취소특징async let 은 선언된 순간 비동기 작업을 시작하고, 자동으로 취소 전파 대상이 됨await 하기 전에 부모 Task가 취소되면, async let 작업도 취소됨특별히 .cancel() 하지 않아도 자동으로 정리(cleanup) 됨예시fu..
작업의 즉시 멈춤이 아닌, ‘취소를 전파’하는 개념Swift의 Task는 취소를 요청받더라도, 즉시 중단되는 것이 아니다.대신, “취소되었다는 신호” 를 내부적으로 가지고 있고, 작업 내에서 그 신호를 직접 확인하고 적절히 대응해야 함.이걸 "cooperative cancellation" 이라고도 함. 작업이 스스로 확인하고 정리하는 방식.(협동적 취소)부모-자식 관계와 취소 전파Swift의 structured concurrency에서는 부모 Task가 있고, 그 안에 자식 Task가 만들어질 수 있어.부모 Task가 취소되면, 자식 Task에게도 취소가 전파됨.하지만! 자식 작업이 완전히 끝날 때까지 (심지어 에러가 발생했더라도), 부모 작업은 기다림.즉, 취소되더라도 자식 작업은 graceful하게 ..
📘 개요MVVM 패턴에서 ViewModel(이하 VM)은 UI 요소와 독립적이어야 한다고들 합니다.그런데 그 '독립성'의 기준은 어디일까요?예를 들어, UIKit을 import 하지 않으면 독립적인 걸까요?UILabel의 텍스트처럼 화면에 표현될 값을 포장하여 다루는 건 괜찮을까요? (ex: n 개, n원)혹은 View가 isHidden일지 말지를 판단하는 Bool값을 ViewModel에서 들고 있는 건 괜찮을까요?이 글은 제가 실제로 진행한 프로젝트에서 MVVM을 따르고 있다고 생각했지만, 결과적으로는 안티 패턴에 가까운 코드를 작성했던 경험을 되돌아보며,ReactorKit을 기준으로 어떤 식으로 View와 ViewModel의 책임을 분리했는지 정리한 글입니다🎭 “State는 화면의 상태”라는 말의..