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

MVC가 Massive View Controller라는 농담이 있다. 코코아 MVC에서는 뷰컨이 뷰의 역할도 하고 컨트롤러의 역할도 하기 때문에 뷰컨이 하는 일이 너무 많아지기 때문이다. 전통적인 MVC에서 모델, 뷰, 컨트롤러 3가지는 다음과 같은 일을 한다. Model : 비즈니스 로직 수행에 필요한 데이터 구조를 정의하고 담는 역할 View : 유저에게 보일 뷰를 구성하고, 사용자 인풋을 받고 컨트롤러가 주는대로 아웃풋을 그리는 역할 Controller : 뷰와 모델의 중간 다리 역할로, 뷰에서 일어나는 사용자 인풋은 컨트롤러에 전달. 컨트롤러는 인풋으로부터 모델에 반영하고, 모델 변화에 따른 아웃풋을 뷰를 업데이트하는 역할. MVVM은 뷰컨이 뷰의 역할만 할 수 있도록 하고, 뷰모델이 MVC에서 ..
iOS 앱의 아키텍처를 잡는 문제는 아니고, 프로젝트가 있으면 파일을 어떻게 그룹별로 관리하는 게 좋은지에 대한 글이다. 사실 회사 코드의 경우 이미 쓰임새에 맞춰 그룹별로 잘 나눠져 있어 크게 고민할 건 없는데, 개인 프로젝트를 할 때면 고민이 생긴다. 뷰 컨트롤러끼리는 같은 그룹에 둬야 하나? 아니면 같은 화면을 구성하는 것들을 같은 그룹에 둬야 하나? 그룹 구조 잡는 일은 별 거 아니라고 생각할 수도 있지만 화면이 많아지고 파일이 많이 생기다 보니 미리부터 고민을 좀 해둘걸 하는 생각이 들어서 지금이라도 쓴다. 실은 미래의 내가 참고하라고 쓰는 글에 더 가깝다. 서로 연관되어 있거나, 공통점이 있는 것들을 같은 그룹에 넣는다. 예를 들면, 같은 모듈이나 화면 등을 이루는 모델, 뷰모델, 뷰컨트롤러는..

노치 있는 status bar나 home indicator 부분까지 색상이 깔린 디자인을 받을 때가 종종 있다. 폰마다 status bar, home indicator 영역이 조금 다르다. 예를 들어, 홈 버튼이 있는 아이폰 SE 2, 3세대 등의 폰은 아예 home indicator 영역이 잡히지 않는다. 무조건 화면 아래에 constraint를 깔고 constant 34 주는 게 능사가 아닐 수 있다는 이야기다. 우선 status bar 배경색을 주는 방법부터 살펴보자. 2가지 방법이 있다. (1) statusBarManager 사용 첫 번째는 windowScene의 statusBarManager를 사용하는 것이다. UIApplication의 windows 중 첫 번째 window의 windowSce..

한 뷰에서 동적으로 폰의 상태 바 색상을 변경해야 할 때가 있는데, 정적으로 설정하는 방법만 있고 동적으로 설정하는 건 잘 없어서 쓴다. 일단 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) } ..