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

한 뷰에서 동적으로 폰의 상태 바 색상을 변경해야 할 때가 있는데, 정적으로 설정하는 방법만 있고 동적으로 설정하는 건 잘 없어서 쓴다. 일단 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) 이 코드는 겉보기엔 별 문제가 없어보이지만, 실제로 이 코드가 동작하는 시점에서는 ..
릿코나 프로그래머스는 아예 입력 자체를 함수 인자로 주는데 백준은 입력을 직접 받고 출력도 print로 처리해야 한다. 백준 문제에서 입출력으로 헤매는 불상사가 있으면 안 될 터.. 입력 1. 한 줄 문자열로 입력받기 readLine()! 2. 숫자 한 개 입력받기 Int(readLine()!)! 3. 한 줄에 공백으로 들어오는 숫자 입력받기 readLine()!.split(separator: " ").map { Int($0)! } 4. 한 줄에 separator로 들어오는 숫자 입력받기 readLine()!.split(separator: ",").map { Int($0)! } 5. EOF 나오기 전까지 무한으로 입력받기 while let input = readLine() { print(input) } ..

요즘 iOS 앱들은 최저 배포 버전이 낮아봐야 13, 14 정도다. 당연히 SceneDelegate가 있는 프로젝트들이고, 토이 프로젝트 만들 때도 13 미만을 고려하는 경우는 거의 없다. 그래서 AppDelegate만 있는 앱에서 SceneDelegate를 새로 도입해야 할 때 뭘 고려해야 하는지, 같은 생각 자체를 해본 적이 없다. 하지만.. 회사 서비스는 iOS 11부터 지원하고 있었고, 지금까지는 AppDelegate만 사용하고 있었다. 올해 1월에 카플레이를 도입하면서 SceneDelegate를 사용할 일이 있어 이 문제를 고민하게 됐다. 애플 공식 문서를 박박 긁어 AppDelegate, SceneDelegate와 함께 끝까지 가보기로 했다. (?) iOS 13부터는 왜 AppDelegate가..
결론 xcode 14.3부터는 이스케이핑 클로저에서 [weak self] 캡처 후 self 언랩핑을 하면, 명시적인 self를 써주지 않아도 된다 Xcode 14.3이 릴리즈된 지 2달 반이 지났는데 급 릴리즈 노트 포스팅을 하는 건.. 오늘 빌드가 여러 번 터져서 애를 먹었기 때문이다. 원래 Xcode 13 버전을 쓰다가, 카플레이 개발하려고 올해 1월쯤 Xcode 14.1로 올렸다. 그 뒤로 업데이트를 안 하고 있다가, 최신 OS 기기 연결을 위해 14.3으로 업데이트했다. 14.3으로 업데이트한 뒤 처음에는 Missing file libarclite_iphoneos.a 하면서 빌드가 잘 되지 않았는데, 그건 이 스택오버플로우 질문 글을 통해 잘 해결했다. 팟파일로 설치한 써드파티 프레임워크가 있다면..
이번 포스팅은 Realm 시리즈의 최종장으로 realm 사용에 있어서 자주 실수하는 것들과 더 나아가 realm을 더 잘 쓸 수 있는 best practices를 소개한다. Realm에 접근해야 할 때마다 try! Realm() 하기 저번 포스팅에도 썼던 것처럼, Realm을 접근할 때마다 try! Realm()으로 Realm 객체를 그때그때 가져와주는 것이 좋다. 스레드에서 처음 접근할 때 초기화해서 객체를 생성한 뒤로는 그것을 계속 캐싱해서 쓰기 때문에 오버헤드는 그다지 없다. 게다가 다른 스레드에서 쓰려고 하면, ThreadSafeReference로 Realm을 가져가서 써야 하기 때문에 불편하다. 특별한 사유가 없다면 접근할 때마다 Realm 객체를 가져온다. // 가급적 피하세요 static l..