본문 바로가기

전체 글388

App Project [PROJECT] : 생성하는 모든 프로젝트는 해당 특정 프로젝트의 모든 대상에 대한 기본 빌드 설정을 정의한다. : 하나 이상의 소프트웨어를 만드는데 필요한 모든 파일, 리소스, 정보를 위한 저장소 Info Deployment Target : 해당 iOS 타겟을 설정해줄 때는 iOS 점유율을 참고하여 설정 Configuration : 기본적으로 Debug, Release를 지원하며 개발 버전, 릴리즈버전, 무료버전, 유료버전, 베타 등 다양한 환경에서 테스트를 할 때 사용함 Localization : 로컬라이징(나라별로 언어를 설정하는 것) 해주고 싶은 언어를 설정해주는 곳 Build Settings : 빌드 설정은 어떻게 특정 측면의 제품 빌드과정이 수행될 지에 관한 정보를 포함하는 변수 수정된 Bu.. 2022. 3. 28.
App Life Cycle / Scene Life Cycle / View Life Cycle [App] Life Cycle Not Running : 앱이 실행되지 않은 상태 : 실행되고 난 후, 시스템은 UI가 화면에 보여야한다면 앱을 inactive 상태에, 아니라면 background 상태에 둔다. : foreground로 시작할 때 시스템은 자동으로 앱을 active상태로 전환한다 Inactive : 앱이 foreground에서 실행중이지만 아무런 이벤트를 받지 않고 있는 상태 : 앱의 화면은 보이지만 상호작용이 안되는 상태 Active : 앱이 foreground에서 실행중이며 이벤트를 받고 있는 상태 : 앱의 화면도 보이고 상호작용도 되는 상태 Background : 앱이 background에 있으며 실행되는 코드가 있는 상태 : 대부분 앱은 suspended상태로 이행하는 도중에 일시.. 2022. 3. 28.
Info.plist - Privacy 알아두면 좋은 속성 - 앱 reject 사유로 자주 언급되는 항목 사용예시 - Privacy - Camera Usage Description [Privacy - Access to a File Provide Domain Usage Description] 앱이 파일 공급자가 관리하는 파일에 액세스해야 하는 이유를 사용자에게 알려주는 메시지입니다. [Privacy - AppleEvents Sending Usage Description] 앱이 Apple 이벤트를 보낼 수 있는 기능을 요청하는 이유를 사용자에게 알려주는 메시지입니다. [Privacy - Bluetooth Always Usage Description] 앱이 블루투스에 액세스해야 하는 이유를 사용자에게 알려주는 메시지입니다. [Privacy - Bl.. 2022. 3. 28.
동기 / 비동기와 직렬 / 동시 [GCD] GCD: 우리가 Queue에 작업을 보내면 그에 따른 Thread를 적적히 생성해서 분배해주는 방법 GCD에 대해서 자세히 말하자면 어느 Task를 어느 Thread가 할 것인지, Mutil - Thread로 할 것인지, Sync으로 할지, Async로 할지 등을 처리하는 API queue: OS자체에서 다른 Thread들에게 일을 분산처리 해주는 곳 (선입선출) - GCD에서 사용하는 queue의 이름은 Dispatch Queue 이다. 즉, Dispatch Queue에서 작업이 추가되면 GCD는 작업에 맞는 Thread를 자동으로 생성해서 실행하고, 작업이 종료되면 Thread를 제거하게 된다. 이제 그림을 나타내면 아래와 같다. 코드로 작성해본다면 DispatchQueue.global().. 2022. 3. 28.
HTTP 응답 코드 종류와 HTTP 메소드 종류 HTTP 응답 코드 종류 100 Continue (클라이언트로 부터 일부 요청을 받았으며 나머지 정보를 계속 요청함) 101 Switching protocols 200 OK(요청이 성공적으로 수행되었음) 201 Created (PUT 메소드에 의해 원격지 서버에 파일 생성됨) 202 Accepted(웹 서버가 명령 수신함) 203 Non-authoritative information (서버가 클라이언트 요구 중 일부만 전송) 204 No content, (사용자 요구 처리하였으나 전송할 데이터가 없음) 301 Moved permanently (요구한 데이터를 변경된 타 URL에 요청함) 302 Not temporarily 304 Not modified (컴퓨터 로컬의 캐시 정보를 이용함, 대개 gif 등.. 2022. 3. 28.
URL to Image let url = URL(string: "해당URL입력") let data = try? Data(contentsOf: url!) foodImage.image = UIImage(data: data!) 2022. 3. 28.
HexColor 사용하기 extension ViewController { func hexStringToUIColor (hex:String) -> UIColor { var cString:String = hex.trimmingCharacters(in: .whitespacesAndNewlines).uppercased() if (cString.hasPrefix("#")) { cString.remove(at: cString.startIndex) } if ((cString.count) != 6) { return UIColor.gray } var rgbValue:UInt32 = 0 Scanner(string: cString).scanHexInt32(&rgbValue) return UIColor( red: CGFloat((rgbValue & .. 2022. 3. 28.
Navigation Controller 관련 코드 1. Navigation bar 없애기 사용이유: Navigation bar를 사용하지 않고 버튼과 UIView를 통해서 Navigation bar를 구현할 때 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.setNavigationBarHidden(true, animated: animated) } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) self.navigationController?.setNavigationBarHidden(false, animate.. 2022. 3. 28.
Alamofire 관련 코드 1. Get - queryString import Foundation import Alamofire class FastRequest { func getData() { let url = "해당URL입력" let params = [ "매개변수명" : "값"] AF.request(url, method: .get, parameters: params, encoding: URLEncoding.queryString) .validate() .responseDecodable(of: FastResponse.self) { response in switch response.result { case .success(let response): print("DEBUG>> Success \(response) ") //로그인한 사용자.. 2022. 3. 28.
모듈화 - iOS 라이징테스트 템플릿 라이브러리 이용 팝업 - code 팝업 - storyboard DropDown - pickerView 이외의 선택 View Bottom Sheet 움직이는 Label TapMan - 상단탭으로 화면전환 Side Menu Charts Auto---Banner_Demo TableVie Json To TableView - 템플릿 버전 x Json To TableView - 템플릿 버전 O TableView_Demo - 마켓컬리 마이컬리 ExpandableTableView_Demo - 마켓컬리 카테고리 가로 스크롤 + 테이블뷰 커스텀 CollectionView-in-TableView(라인 1개) 커스텀 CollectionView-in-TableView(라인 여러개) 소셜로그인 FaceBook.. 2022. 3. 28.
화면전환 방법 1. 네비게이션 컨드롤러를 이용한 화면전환 우선 Navigation Controller - ViewController - ViewController 형식으로 만들어준다. Navigation Controller - ViewController를 segue로 "root view controller" 연결하고 첫번째 ViewController에 버튼을 놓아준다. 첫번째 ViewController의 버튼과 두번째 ViewController를 segue로 "show" 연결한다. 2. 화면 일부 / 전부를 덮는 modal 아래와 같이 버튼과 ViewController 두개를 구성해준다. 일부만 덮는) 버튼을 두번째 ViewController와 segue로 "Present Modally" 연결해준다. 전체를 덮는) 버.. 2022. 3. 28.
Navigation back button custom하기 Navigation Controller의 bar를 선택해서 back, back Mask 이미지를 바꾼다. root ViewController에 있는 bar를 선택한다. Back Button부분에 스페이스바를 한번눌러 공백을 만들고 Enter를 눌러주면 < back 에서 2022. 3. 28.
TableView로 스크롤되는 UI 구성하기 오늘은 스크롤 되는 화면을 구성할 때 사용한 방법을 설명해보겠다. 만들어볼 화면은 배달의 민족앱에서 장바구니 화면을 구현해볼 것이다. 0. 앱을 만들기전 기획 기획단계에서는 아래의 항목이 들어가면 좋다. 몇개의 Cell을 사용할 것인지? 각 Cell의 Height Cell 내부의 Label, Button의 여부 1. TableView와 UIView를 사용해서 스크롤이 되지 않는 고정적인 UI만 구성해준다. 상단: UIView 위에 장바구니 Label과 전체삭제 Button 하단: 주문하기 Button과 그 아래의 UIView 2. UI구성을 완료했다면 각 Cell을 만들어보자. cell을 구성하기전 TableViewCell을 아래와 같이 만들어야함. ) 중요! indetifier는 각 Cell의 Clas.. 2022. 3. 28.
Push segues can only be used when the source controller is managed by an instance of UINavigationController. Push segues can only be used when the source controller is managed by an instance of UINavigationController. 위와 같은 에러가 떴을 땐 대부분의 문제는 UINavigationController를 연결하지 않아서 생기는 오류이다. 하지만 나는 위의 문제외의 다른 문제가 발생해서 생기는 오류의 해결법에 대해서 작성하겠다. [문제] 현재 내 상황은 로그인VC에서 MainVC를 연결하고 MainVC에서 버튼을 클릭하면 Push로 화면 전환을 하도록 만들었다. (이때 MainVC는 UINavigationViewController와 연결되어 있다.) 하지만 Push를 코드를 작성하면 아무런 반응이 없었고 Segue로 연결하면 위의.. 2022. 3. 27.
UserDefaults UserDefaults를 사용하는 이유? 앱내부에 데이터를 저장해야 하는 경우 보안이 필요하지 않는 소량의 데이터를 저장할 때 사용한다. 대량의 데이터는 다른 방법으로 UserDefaults의 데이터 저장 형태 데이터는 [데이터, Key] 형태로 저장한다. 이때 Key는 String이다. UserDefaults의 사용법 현재 우리가 토글 스위치 상태를 저장하려 한다고 생각하고 코드를 바라보자. UserDefaults.standard.set(TestSwitch.isOn, forKey: "switchState") // 스위치의 상태를 데이터 저장 1 let myUserDefaults = UserDefaults.standard myUserDefaults.set(TestSwitch.isOn, forKey: "s.. 2022. 3. 27.
실습편 - Dynamic Font 이미지 크기에 따라서 text의 크기가 변경되는 인증서 실습을 해보겠다. [잘못된 방법의 예시 - 비율 문제] 1. image View를 화면에 놓고 인증이미지를 선택해준다. 2. cmd + = 을 눌러서 실제 이미지의 크기를 화면에 만들어주고 leading, trailing을 각 20씩 잡아주고 vertical정렬을 해준다. Content Mode에 대해서 scaleToFill: 이미지의 높이와 너비가 ImageView의 크기와 동일하게 늘어난다. AspectFit: 이미지의 가장 긴 부분(height or width)이 ImageView와 일치하도록 늘어난다. (이미지 왜곡x) AspectFill: 이미지의 가장 짧은 부분(height or width)이 ImageView와 일치하도록 늘어난다. (이.. 2022. 3. 27.
12. 코드로 컴포넌트 추가하기 1. 객체 생성 let myButton = UIButton.init(type: .system) //시스템 타입의 버튼 객체 생성 2. 타이틀 작성 myButton.setTitle("MyButton", for: .normal) //버튼의 title을 작성하고 일반 버튼으로 설정 3. addSubview self.view.addSubview(myButton) //현재 ViewController에 addSubview를 통해서 버튼을 올리는 것 현재까지의 코드 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let myButton = UIButton.init(type: .sy.. 2022. 3. 27.
11. Botton [Button inset] Label과 다르게 버튼은 터치로 눌러야하기 때문에 Xcode자제에서 기본적으로 컨텐츠에 비해서 여백을 만들어준다. Label도 위아래 여백이 있는거 처럼 보이지만 여백이 없이 text에 딱 맞춰진 것이다. 따라서 Label에는 inset을 조절하는 부분이 없다. 버튼으로 돌아와서 버튼의 사이즈 인스펙터로 가면 Content insets이라는 부분이 있다. 이 부분을 통해서 버튼의 여백을 조정해보자. 현재 버튼의 위아래 여백은 있는데 왼쪽, 오른쪽의 여백은 없으므로 추가해보자. (좌우 10) 여백이 추가는 되었지만 컨텐츠의 크기가 줄어들었기 때문에 "Cmd + ="을 눌러서 여백과 컨텐츠에 맞는 버튼의 크기로 만들자. 이렇게 해주면 기본적으로 위아래 여백 + 양쪽 10씩의 여백.. 2022. 3. 27.
10. StackView StackView의 장점은 여러개의 컴포넌트를 정렬해야할 때 복잡한 Constraints를 단순화 시켜서 간단하게 만들 수 있다. StackView를 화면에 놓고 다른 컴포넌트들을 StackView위에 놓으면 StackView안에 컴포넌트들이 들어가게 된다. 하지만 위의 방식처럼 StackView에 컴포넌트를 추가하는 경우 View자체를 2개이상 추가했을 때 상위View에 View가 들어가서 중첩 View가 될 수 있다. 다음 방법으로 진행하면 오류가 나지 않게 만들 수 있다. [오류 없는 StackView] 1. StackView에 넣을 컴포넌트들을 우선적으로 화면에 배치해준다. 폰트와 글자 길이가 다른 Label 3개를 추가해주었다. 2. 추가한 컴포넌트를 모두 클릭하고 우측하단에 있는 Embed i.. 2022. 3. 27.
9. Margin 1. View를 추가하고 배경색을 바꿔준다. 2. Constrains를 모두 0으로 잡아준다. 이 때 우리가 항상 체크해제했던 Constrains to margins을 체크해준뒤 잡아준다. 딱히 달라진건 없다. marging을 체크한다는 것은 View안의 무언가를 넣었을 때와 관련있기 때문에 View 외부의 어떤 Constraints와는 관련이 없어서 아무 변화가 없다. View의 사이즈 인스펙터를 보면 아래와 같은 layout margins이 있다. layout marginsdml Defaults 값은 8이다. 무슨말인지는 아래의 과정으로 확인해보자. 3. 이제 새로운 View를 추가해서 margin을 체크했을 때랑 하지 않았을 때의 차이를 보자. [체크해제] [체크] "layout marginsdml.. 2022. 3. 27.
8. ScrollView ScrollView를 사용하는 상황은 이미지 또는 컨텐츠가 화면의 크기로 감당할 수 없을 때 사용한다. [큰 이미지를 스크롤 뷰로 보기] 1. 우선 이미지를 준비해서 imageView를 이용해서 이미지를 추가한다. (Content Mode: Scale To Fill) Editor - size to fit Contetnt을 클릭하면 아래와 같이 화면크기보다 이미지의 크기가 큰것을 확인할 수 있다. 이 크기를 우리는 스크롤 View를 이용해서 나타내보려고 한다. 이미지 크기는 다시 원래 상태로! 2. 해당하는 컨텐츠를 클릭하고 우측하단에 Embed in View - ScrollView를 클릭해준다. 3. 이제 ScrollView를 전체화면크기로 키우기 위해서 Constraints의 값을 모두 0으로 해준다... 2022. 3. 27.
7. Size Class 이번에는 핸드폰 화면 방향이 세로모드와 가로모드가 되었을 때의 오토레이아웃에 대해서 배워보자 1. 우선 위에는 버튼이 있고 아래에는 textView가 있는 화면을 구성해보자. 2. Constraints를 top 30 leading 30 trailing 30 bottom 30으로 잡아보자. 버튼이 잘 안보이기 때문에 색상을 넣어주자. HIG - Adaptivity and Layout - Size Class를 보면 [세로모드] width: Compact (작음) height: Regular (보통) [가로모드] width: Compact or Regular (Any) height: Compact (작음) 즉, 세로모드일 떄는 height: Regular 가로모드일 때는 height: Compact 라는 것을.. 2022. 3. 27.
6. priority★★★ priority: 우선순위 내가 우선순위를 설정했다는 것은 여러개의 컴포넌트들이 화면에 있을 때 우선순위가 높은 것들이 먼저 크기, 위치가 지정이 되고 낮은 것들은 나중에 지정이 되는 것이다. Content Hugging Priority: 주어진 크기보다 작아질 수 있다. Content Compression Resistance Priority: 주어진 크기보다 커질 수 있다. priority는 1부터 1000까지 설정할 수 있다. 수가 높을 수록 우선순위가 높은 것이다. 1000은 어떤 상황에서도 먼저 변화지 않는 상태를 만들어 놓는 것이다. [Hugging priority 실습] Content Hugging Priority: 주어진 크기보다 작아질 수 있다. 1. 화면에 Label 두개를 놓는다. 2... 2022. 3. 27.
5. Multiplier Multiplier: 곱, 비율 [Multiplier 개념] Multiplier는 쓰기가 까다로운 상황들이 있어 정확하게 알고 써야한다. 1. View를 추가하고 Contraints를 각 0으로 설정해서 화면에 꽉 차도록한다. (SafeArea내부에서 꽉차게) 2. View를 선택하고 Leading의 Multiplier를 조절해보자. 0.5(50%): 기존의 반 1(100%): 기존과 동일 2(200%): 기존의 두배 하지만 직접 조절해보면 아무런 변화가 없다. 그 이유는 Leading부분이 시작하는 곳이 0이기 때문에 0 * 0.5 = 0, 0 * 1 = 0, 0 * 2 = 0 으로 변화가 없다. 그러면 Constant를 조정해주면 변화가 생기지 않을까? 전혀 변화가 없다. 그 이유는 Constant는.. 2022. 3. 27.
4. Align Align: 정렬 화면에 새로운 두개의 View를 놓고 크기를 다르게 설정해보자. 노란색(200 200) 빨간색 (100 100) 크기에 대한 부분은 지정이 되었지만 위치에 대한 정보는 지정되지 않아서 오류가 뜬다. 그렇기 떄문에 아래와 같이 위치를 잡아보자. 노란색 (top: 20, leading: 20) [정렬해보기 - 2개] 이제 빨간 View를 노란 View와 정렬을 해보자. 1. 두 View를 동시에 클릭한다. 2. 우측 하단에 있는 align을 클릭해서 Top Edges, Leading Edges를 클릭해준다. 결과적으로 빨간색 View가 노란색 View의 top, leading에 맞게 정렬이 되고 크기는 아까 잡아둔대로 100 100으로 잡히게 된다. (Top Edges, Leading Ed.. 2022. 3. 27.
3. Constraints Equal Constraints Equal [두개 이상의 View의 Constraints] 위와 같이 UIView로 화면을 구성하고 4방향의 Constraints를 20씩 설정해주자. 여기서 Trailing의 Constraints는 화면으로부터 20의 Constraints가 잡히는 것이 아니라 노란색 View부터 20의 Constraints가 잡히는 것이다!!! [오류 발생1 - 왼쪽View, 오른쪽 View] Constraints을 잡게 되면 위와 같이 에러가 뜨는 것을 확인 할 수 있다. 그 이유는 노란색 View의 Constraints가 제대로 잡히지 않아서이다. 보라색 View의 Trailing은 노란색 View와 Constraints를 공유하기 떄문에 노란색 View 입장에서는 Leading이 잡히게 된다.. 2022. 3. 27.
2. SafeArea SafeArea Safe Area는 아이폰x부터 만들어졌다. 아이폰 11화면에 UIView를 올려놓고 가운데 정렬후에 bottom Constraints를 0, height, width는 기존의 크기로 해준다. [Bottom Constraints] 이렇게 설정을 하고 사이즈 인스펙터에서 bottom Constraints를 보면 Constraints가 0이 아닌 Safe Area로 되어있다. 즉, 화면자체에서 Constraints 0이 아니라 Safe Area 내부에서 Constraints 0이 기본적인 설정 값이다. [Top Constraints] 상단에도 똑같이 UIView를 추가해서 top Constraints 값을 0으로 해보자. 0으로 하게되면 bottom과 같이 Safe Area 내부의 Const.. 2022. 3. 27.
1. Constraints Constraints: 제약사항 우선 UIView를 아이폰11화면에 놓고 Constraints를 4방향으로 20씩 설정해보자. (margins은 체크를 해제해주자. margins에 대한 설명은 다른 챕터에서...) 설정을 모두 하게되면 아래와 같이 된다. 여기서 Constraints를 잘보면 왼쪽, 오른쪽으로는 디바이스의 끝까지 갔지만 위아래를 보면 어느정도의 영역을 두고 Constraints 20이 설정된 것을 볼 수 있다. 즉, SafeArea라는 영역 내에서 Constraints 20씩 설정이 된 것이다. 이제 UIView를 누르고 사이즈 인스펙터 영역을 보면 우리가 어떤 값으로 Constraints을 설정했는지 볼 수 있다. 사이즈 인스펙터를 보게되면 top, bottom, Leading, Tra.. 2022. 3. 27.