본문 바로가기

iOS - 실무관련/iOS33

왜 @IBOutlet에 didSet으로 설정을 몰아 놓는가? 보호되어 있는 글 입니다. 2022. 9. 20.
WidgetKit에 대한 간단한 설명 // 참고 URL: https://zeddios.tistory.com/1088?category=796110 import WidgetKit import SwiftUI // TimelineProvider: Widget의 디스플레이를 업데이트 할 시기를 WidgetKit에 알려주는 타입 struct Provider: TimelineProvider { func placeholder(in context: Context) -> SimpleEntry { SimpleEntry(date: Date()) } // 현재 상태를 나타내는 스냅샷을 가져오는 메소드 func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) { let entry.. 2022. 9. 13.
WKWebView - 웹사이트의 버튼이 안눌러질 때? //busy version func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) { print("scheme: \(navigationAction.request.url?.scheme)") if let url = navigationAction.request.url , ["버튼을 클릭했을 때 출력되는 scheme"].contains(url.scheme) { UIApplication.shared.open(url, options: [:], completionHandler: nil) decisionH.. 2022. 8. 18.
NotificationCenter로 다른 VC 조종하기 NotificationCenter란? NotificationCenter 에 등록된 event 가 발생하면 해당 event에 대한 행동을 취합니다. 앱 내에서 메세지를 던지면 아무데서나 이 메세지를 받을 수 있게 하는 역할을 합니다. 보통 백그라운드 작업의 결과, 비동기 작업의 결과 등 현재 작업의 흐름과 다른 흐름의 작업으로부터 이벤트를 받을 때 사용합니다. NotificationCenter으로 다른 VC 조종하기 1. 데이터를 보내는 VC (본인이 원하는 타이밍에) NotificationCenter.default.post(name: Notification.Name(rawValue: "지정할 이름"), object: nil) 2. 데이터를 받는 VC // 옵저버 등록 NotificationCenter.d.. 2022. 8. 17.
IBSegueAction사용해서 화면전환하기 ✍🏼 상황: 테이블 뷰를 클릭했을 때 화면이 전환되면서 클릭한 cell의 title이 전환된 화면 중앙에 나타난다. ✍🏼 1. 화면구성하기 아래와 같이 화면을 구성해준다. Navigation Controller - TabeView가 있는 ViewController Label이 있는 ViewController 2. Segue연결해주기 아래와 같이 화면을 Segue로 연결해서 화면 전환을 시켜준다. Navigation Controller - TabeView가 있는 ViewController ---(Segue)--- Label이 있는 ViewController 3. IBSegueAction연결하기 + Segue Identifier 입력하기 아래와 같이 Segue를 우클릭해서 IBSegueAction을 만들어주.. 2022. 8. 4.
Designated Init / Convenience Init / Failable Init / Super.init / required init Designated Init (지정 초기자) 클래스 타입은 반드시 한개 이상의 Designated Init이 필요하다. 클래스의 모든 프로퍼티를 초기화해야한다. class Person { var name: String var age: Int? var address: String init() { name = "DH" address = "서울특별시" } init(name: String, address: String) { self.name = name self.address = address } } Convenience Init (보조 초기자) Convenience init 내부에서 반드시 Designated Init이 호출되어야 한다. (self.init()) class Person { var name: S.. 2022. 7. 30.
label 행간 조정 func labelSetting(label: UILabel) { label.numberOfLines = 0 // Label의 글자 줄을 제한두지 않음. let attrString = NSMutableAttributedString(string: label.text ?? "") // 텍스트에 대한 관련 속성이 있는 문자열 let paragraphStyle = NSMutableParagraphStyle() // 문단 스타일 속성의 하위 속성 값을 변경하는 개체 paragraphStyle.lineSpacing = 3 // 행간 조정 attrString.addAttribute(NSAttributedString.Key.paragraphStyle, value: paragraphStyle, range: NSMakeRa.. 2022. 7. 5.
dismiss를 하고 이벤트 발생 시키는 방법 참고: 스택오버플로우 화면전환시 이벤트를 발생시키려면 생명주기를 활용해서 해당 이벤트를 실행시키면 된다. 하지만 dismiss를 사용하는 경우 생명주기를 거치지 않는다. (.FullScreen은 제외) 이런 상황에서 이벤트는 어떻게 발생시켜야할까? 1. 첫번째 ViewController에 프로토콜을 정의한다. protocol ViewControllerDelegate: UIViewController { func refresh() } 2. 두번째 ViewController에 delgate를 만든다. weak var delegation: ViewControllerDelegate? 3. delegate = self를 통해서 delegate 지정 delegation = self 4. 프로토콜을 채택하고, 해당 프.. 2022. 6. 23.
Notification push 앱에서 알람 거부에서 허용으로 설정 결론을 말하자면 거의 불가능이다. '거의'라고 말한 이유는 방법이 하나 있기 때문이다. 알람 거부에서 허용으로 바꾸려면 아이폰 설정에 들어가서 허용으로 바꾸라고 해야한다. (아래의 사진확인) 따라서 앱 자체에서 거부된 권한을 허용으로 변경할 수는 없다. 2022. 6. 14.
Delegate 패턴 아래의 글은 해당 블로그를 참고하여 작성하였습니다. (+ 다른 블로그) 1. Delegate는 무엇인가? Delegate란 어떤 객체가 해야 할 일을 부분적으로 확장해서 대신 처리한다. 2. Delegate는 어디에 사용되는가? Delegate는 두 가지만 기억하면 된다. 1. 처리하라고 시키는 객체 2. 대신 처리해줄 객체 0. 상황 상황: 여러곳에서 사용할 수 있는 메시지 창을 만들려고한다. 메시창에는 버튼이 있고 해당 버튼을 누르면 ViewController는 무슨 버튼을 눌렀는지 확인해서 그 버튼이 이벤트가 발생하면 해야하는 일들을 처리해야 한다고 한다. 1. 처리하라고 객체 우선 대신 처리하라고 시키는 객체를 만들기 전에 우리는 객체의 프로토콜을 선언해주는 작업이 필요하다. (이후 대신 처리해줄.. 2022. 6. 12.
textView행간 조절, 정렬, 폰트, 폰트 사이즈 설정하기 let explainText = "안녕하세요 \n iOSoo입니다." let style = NSMutableParagraphStyle() //단락 스타일 속성의 하위 속성 값을 변경하기 위한 개체입니다. style.lineSpacing = 5 //text 행간 조절 style.alignment = .center //text 정렬 let attributes = [NSAttributedString.Key.paragraphStyle : style] explanationTextView.attributedText = NSAttributedString(string: explainText, attributes: attributes) explanationTextView.font = .systemFont(ofSize: .. 2022. 6. 8.
Pinch 제스처로 이미지 확대 축소하기 https://zeddios.tistory.com/343 Pinch 기본적인 코드는 해당 블로그 참고해서 작성 https://github.com/iOS-junsoo/Pinch 깃헙주소 1. 제한 없이 이미지 확대 축소하기 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() myView.isUserInteractionEnabled = true } var recognizerScale: CGFloat = 1.0 var maxScale: CGFloat = 2.0 var minScale: CGFloat = 1.0 @IBOutlet weak var myView: UIView! @IB.. 2022. 6. 5.
원형 View 만들기 extension UIView { @IBInspectable var borderWidth: CGFloat { set { layer.borderWidth = newValue } get { return layer.borderWidth } } @IBInspectable var cornerRadius: CGFloat { set { layer.cornerRadius = newValue } get { return layer.cornerRadius } } @IBInspectable var borderColor: UIColor? { set { guard let uiColor = newValue else { return } layer.borderColor = uiColor.cgColor } get { guard let .. 2022. 5. 22.
SceneDelegate에서 특정 ViewController 보여지게 만들기 self.window?.rootViewController = UIStoryboard(name: "스토리보드 이름", bundle: nil).instantiateViewController(withIdentifier: "VC이름") 위의 코드는 특정상황에서 앱을 들어갈 때 다른 ViewController가 present 되도록 만들때 나오게 만든다. 2022. 5. 8.
DatePickerView 24h 설정하기 DatePickerView로 시간을 설정할 때 12시간짜리와 24시간 짜리를 설정하고 싶을 때가 있을 것이다. 대부분 12시간을 기본 값으로 한다. 하지만 이때 AM과 PM을 없애려면 어떻게 해야할까? DatePickerView - Attributes inspector - DatePicker - Locale - English(Gibraltar)를 설정해주면 24시간으로 설정된다. 2022. 4. 17.
시작하는 Storyboard 변경하기 1. 기존 MainStoryboard의 is Initial View Controller를 해제해준다. 2. 변경할 Storyboard를 생성하고 is Initial View Controller를 체크해준다. 3. Info파일에서 Main storyboard file base name과 Storyboard Name을 변경할 Storyboard 이름으로 변경해준다. 2022. 4. 17.
Multi Thread [Thread vs Multi - Thread] 1. Thread란 (작업의) 실 / 흐름 / 시퀀스이다. 2. Thread의 속성 연속성 흐름 자율성 독립성 지금은 위의 말이 무슨 말인지 와닿지 않을 수 있다. 앞으로 글을 읽다보면 이해가 될 것이다. 설명하기전 우리가 앱을 만드는 방식을 살펴보면 아래의 사진처럼 UI를 제작하고 Logic을 구성하고 UI 또는 Data를 업데이트할 것이다. 이 때 Logic 구성과 UI/Data 업데이트를 우리는 앞으로 Task(작업단위)로 칭할 것이다. 수업을 한 예시로 Thread를 표현하면 아래의 사진처럼 표현할 수 있다. 아래의 사진을 보면 어색한 부분이 있는데 그 부분은 수업과 필기가 따로 행해지고 있다는 것이다. 위의 표현처럼 수업이 진행된다고 하면 선생님이.. 2022. 4. 16.
Tabbar 관련 변경 폰트변경 AppDelegate - didFinishLaunchingWithOptions 에서 폰트 변경 코드를 입력한다. func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // 탭바 폰트 설정 let appearance = UITabBarItem.appearance() let attributes = [NSAttributedString.Key.font:UIFont(name: "폰트 이름", size: 폰트사이즈)] appearance.setTitleTextAttributes(attributes as [NS.. 2022. 4. 16.
UI component UI component를 알아보기전에 UIKit이 무엇인지 알아보자. UIKit이란 iOs 애플리케이션의 사용자 인터페이스를 구현하고 이벤트를 관리하는 프레임워크(제공받은 일정한 요소와 틀, 규약을 가지고 무언가를 만드는 일)이다. UIKit 프레임워크는 제스처 처리, 애니메이션, 그림 그리기, 이미지 처리, 텍스트 처리등 사용자 이벤트 처리를 위한 클래스 포함. Table View, Slider, Button, Text Field등 애플리케이션의 화면을 구성하는 요소를 포함. UIKit은 iOS와 tvOS 플랫폼에서 사용 [Label] - 정보 텍스트의 한 줄 이상을 표시하는 보기. - 텍스트의 글꼴, 텍스트 색상, 정렬, 강조 표시 및 음영을 제어 가능. [Button] - 사용자 상호 작용에 대한 .. 2022. 3. 28.
Info.plist Info.plist Full name: Information Property List Files 말 그대로 Info.plist파일은 실행 패키지에 관한 필수 설정 정보가 포함된 구조화된 텍스트 파일이다. Info.plist가 필요한 이유? Info.plist는 번들 실행 파일에 대한 필수 구성 정보를 포함하는 구조화된 텍스트 파일이다. 파일 자체는 반적으로 유니코드 UTF-8 인코딩을 사용하여 인코딩되며 내용은 XML을 사용하여 구성된다. 루트 XML 노드는 번들의 다양한 측면을 설명하는 키 및 값 세트의 콘텐츠를 포함하는 사전이다. (시스템은 이러한 키와 값을 사용하여 앱과 앱 구성 방법에 대한 정보를 얻는다. 결과적으로 번들로 제공되는 모든 실행 파일(플러그인, 프레임워크 및 앱)에는 정보 속성 목록.. 2022. 3. 28.
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.
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.