일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 인프런강의
- SwiftUI
- rxswift
- uikit
- IOS프로그래밍
- 노드JS
- 프로그래머스
- 인프런파이썬
- 교환학생토플
- 토플
- 유학토플
- 웹크롤링
- swift
- IOS
- 인프런오리지널
- JS
- 파이썬웹크롤링
- 인프런
- 스위프트
- 우리를위한프로그래밍
- 카카오톡채팅봇
- 자바스크립트
- 인프런파이썬강의
- 파이썬
- 파이썬중급강의
- 토플공부수기
- 리프2기
- 파이썬중급
- Python3
- nodeJS
- Today
- Total
목록swift (36)
먹고 기도하고 코딩하라

한 뷰에서 동적으로 폰의 상태 바 색상을 변경해야 할 때가 있는데, 정적으로 설정하는 방법만 있고 동적으로 설정하는 건 잘 없어서 쓴다. 일단 iOS 13부터는 preferredStatusBarStyle을 오버라이드해서 상태바의 폰트 색상을 변경할 수 있다. class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent } } 이렇게 하면 뷰에 진입했을 때 정적으로 상태 바 ..

1. 버튼이 아닌 일반 UIView에서 Touch up Inside 등의 탭 이벤트를 감지하려면, UITapGestureRecognizer를 뷰에 붙여줘야 한다. 또한, recognizer가 탭 이벤트를 감지했을 때 수행할 셀렉터 함수도 필요하다. 셀렉터 함수부터 만들어주자. 여기서는 tapSomewhere이라는 이름으로 만든다. class ViewController: UIViewController { @IBOutlet weak var dimmedBGView: UIView! var bgViewTapGesture: UITapGestureRecognizer? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after l..

기본적으로 뷰에 GradientLayer를 깔려면 다음과 같이 해야 한다. CAGradientLayer를 생성하고, frame은 그라데이션을 깔 뷰와 동일하게 맞춰준다. (origin, width, height를 동일하게) 그라데이션할 컬러를 2가지 이상 .colors에 [CGColor] 형태로 담는다. startPoint와 endPoint를 지정하되, x, y의 최소값은 0.0, 최대값이 1.0임을 알고 그 안에서 조절한다. 여기서는 가로 방향 그라데이션을 만들어볼 것이다. 레이어에 대한 설정이 끝났으므로, 뷰의 layer.insertSublayer로 레이어를 삽입한다. 코드는 다음과 같다. 스토리보드로 gradientView를 만들었고, constraint는 다음과 같다. center width : ..

Data(contentsOf:)로 웹상의 이미지를 불러오는 것을 지양해야 하는 이유 회사 코드에 이런 게 있었다. Data(contentsOf:)로 웹 이미지를 가져와서 UIImage(data:)로 이미지 변환한 다음, 이미지뷰에 띄우는 코드다. var urlString: String = "https://cdn.pixabay.com/photo/2016/04/17/10/38/doberman-1334497_960_720.jpg" var imageData: Data = try! Data(contentsOf: URL(string: urlString)!) imageView.image = UIImage(data: imageData) 이 코드는 겉보기엔 별 문제가 없어보이지만, 실제로 이 코드가 동작하는 시점에서는 ..
이번 포스팅은 Realm 시리즈의 최종장으로 realm 사용에 있어서 자주 실수하는 것들과 더 나아가 realm을 더 잘 쓸 수 있는 best practices를 소개한다. Realm에 접근해야 할 때마다 try! Realm() 하기 저번 포스팅에도 썼던 것처럼, Realm을 접근할 때마다 try! Realm()으로 Realm 객체를 그때그때 가져와주는 것이 좋다. 스레드에서 처음 접근할 때 초기화해서 객체를 생성한 뒤로는 그것을 계속 캐싱해서 쓰기 때문에 오버헤드는 그다지 없다. 게다가 다른 스레드에서 쓰려고 하면, ThreadSafeReference로 Realm을 가져가서 써야 하기 때문에 불편하다. 특별한 사유가 없다면 접근할 때마다 Realm 객체를 가져온다. // 가급적 피하세요 static l..

저번에 여러 스레드에서 Realm을 써야 할 때, 어떻게 써야 앱을 살리면서 쓸 수 있는지 살펴봤다. 이번 포스팅에서는 Realm의 Configuration과 스키마 버전을 올릴 때의 마이그레이션 블록에 대해 살펴본다. 2. 마이그레이션 Realm의 스키마 버전(schemaVersion)을 올려야 할 때가 있다. 모델을 새로 생성하거나, 기존의 모델의 필드를 rename하거나 기타 수정을 가하든지 원래 있던 모델을 삭제한다든지 하는 경우이다. column을 추가하거나 새로운 Object를 추가하는 등의 별도 수동 마이그레이션 작업이 필요없는 수정이 있는 경우에는 마이그레이션 블록을 비울 수 있고, 그렇지 않은 경우에는 마이그레이션 블록을 써야 한다. 이 과정에서 Configuration이 개입하는데, 말..

iOS 앱에서 로컬에 데이터를 저장하는 방법은 여러 가지가 있다. 퍼스트파티인 CoreData도 있고, SQLite나 Realm을 쓸 수도 있다. 그 중 Realm의 장점은 속도가 빠르다, 안드로이드나 윈도우, 맥 등 크로스플랫폼 사용이 가능하다, SQL처럼 데이터 스키마를 Table 형식으로 구성하고, 데이터를 row 등으로 관리하는 게 아니라 OOP 패러다임에 맞게 클래스와 객체로 관리한다 등.. 여러 가지가 있다. 우리 회사 iOS 앱은 현재 클립 데이터를 다운로드받는 데에 Realm을 사용하고 있다. 개인 프로젝트에서도 Realm을 쓰긴 했는데 기획도 개발도 내가 하다 보니 요구 사항이 심플해져서 딥하게 쓸 일은 딱히 없었다. 하지만 회사 앱은 기획에 맞게 타이트하게 기능 개발을 해야 해서 이 기..
Swift 5.6 버전이 나온지 어느덧 1년이 지나 다소 뒷북이긴 한데 의외로 많이 알려지지 않은 것 같다. 사실 if #unavailable에 대한 설명 자체는 여기에 잘 정리되어 있는데, 간단히 살펴보고 어떤 경우에 쓰면 좋은지를 함께 소개하고자 한다. 기존 if #available의 쓰임새 타겟 기기의 iOS 버전에 따라 분기를 태워야 하는 경우가 있다. 최근에 카플레이를 해서 이걸로 예시를 들자면, Carplay 프레임워크는 iOS 14 이상에서만 사용할 수 있다. 그리고 이 프레임워크를 사용해야 카플레이를 지원하기 위한 앱을 프로그래밍할 수 있다. 그러니까 다음과 같은 상황이다. 주 기능은 원래 제공하고 있었다. iOS 14 이상에서는 카플레이도 추가로 제공하겠다. 즉, 플랫폼별로 제시하는 OS..