구조체(struct) 및 확장(extension) 기능을 이용하여 코드를 간결하게 작성하는 방법을 나름대로 정리해보려고 합니다. 아래는 구조체를 이용하여 폰트의 종류나 크기로 예를 들어 코드를 작성해 본 것입니다. import UIKit struct Styles { private init(){} struct Fonts { private init(){} static let light = UIFont(name: "NanumSquareL", size: 12.0)! static let regular = UIFont(name: "NanumSquareR", size: 12.0)! static let bold = UIFont(name: "NanumSquareB", size: 12.0)! static let extra..
로그아웃시 세션을 지우지 않으면 로그아웃이 되지 않는 현상이 있었다.간단하게 모든 세션을 지우는 코드를 적어보았다. // 설치된 날짜 가져오는 코드 let urlToDocumentsFolder: URL? = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last let installDate = try? FileManager.default.attributesOfItem(atPath: (urlToDocumentsFolder?.path)!)[.creationDate] as! Date // 설치된 날짜부터 지금까지의 cookie all clear URLSession.shared.configuration.httpCookieStorag..
navigationBar의 배경과 border를 안보이게 하고 싶은 경우, 아래와 같이 작성해 주면 된다.override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default) self.navigationController?.navigationBar.shadowImage = UIImage() } background는 navigationBar의 배경색을 설정하는 속성이고, shadowImage는 border의 이미지를 설정하는 속성이다. 반대로 navigation..
주로 guard문 보다는 if문을 사용해왔는데, 라이브러리를 사용하다보면 guard문을 종종 볼 수 있었다. guard문의 개념과 if문과 비교하여 언제 사용하면 좋을지 알아보면 좋겠다고 생각하여 정리해본다. guard문은 원하는 조건을 충족하지 않을 때, 흐름을 종료하는 목적으로 사용된다. 아래와 같이 쓰인다. guard else { // 조건문이 false일 경우 실행되는 로직. } if문으로 조건문을 처리해도 상관없는데 guard문을 사용하는 이유는 무엇일까. 서칭을 해보고 나름대로 정리해보면 if문은 조건을 체크하여 처리된 값으로 로직의 흐름을 계속 이어나갈 때 사용되고, guard문은 조건을 체크하여 로직이 실행되기 전에 충돌을 막기 위해 사용된다. 아래는 guard문이 어떻게 사용되는지 코드로..
현재 커서의 앞과 뒤의 텍스트를 나누는 방법을 알고 싶었다.그러기 위해서는 현재 커서의 위치를 가져오는게 선행되어야 했다. let textRange = textView.selectedTextRange print("\(textRange)") // (5, 0)B위 코드는 커서 위치를 가져오는 코드이다.그럼 위치를 이용해서 해당 위치의 전과 후의 텍스트를 가져오는 로직을 구현하면 된다. let textString = textView.text! let textRange = textView.selectedTextRange! let offset = textView.offset(from: textView.beginningOfDocument, to: textRange.start) // 커서 앞에 위치한 텍스트 let ..
let textView = UITextView() textView.textAlignment = NSTextAlignment.center위 코드는 UITextView를 가운데 정렬하기 위해 주로 사용되는 방법중에 하나이다.위 방법은 textView 자체에 대한 스타일을 정의할 때 사용된다.하지만 위 방법 외에도 단락에 대해 스타일을 적용하는 방법이 있다는 것을 알게 되었다. let paragraphStyle = NSMutableParagraphStyle() paragraphStyle.alignment = .center let attributes: [String : Any] = [NSParagraphStyleAttributeName: paragraphStyle] let attrString = NSAttrib..
키보드에 다른 화면을 구성하고 싶을 때 키보드의 높이와 다르게 배치하면 이쁘지 않은 화면이 될 수 있다. 이럴 경우, 아이폰의 종류에 따라 딱 맞는 키보드의 높이를 가져와 사용하면 유용할 것이다. 아래는 키보드가 보일 경우와 숨겨질 경우, 호출되는 notification을 observer로 받아서 키보드의 높이를 구하는 코드이다. 키보드의 높이를 구하는 것 뿐만아니라 다른 로직도 구현할 수 있다. override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // keyboardWillShow, keyboardWillHide observer 등록 NotificationCenter.default.addObserver(self,..
ERROR ITMS-90717: "Invalid App Store Icon. The App Store Icon in the asset catalog in 'documera.app' can't be transparent nor contain an alpha channel." 앱 아이콘을 넣고 업로드를 하는 도중에 위와 같은 에러를 만났다.알파 채널을 제외시키라고 하는 내용인데 뭔지 잘 모르겠지만 투명도에 대한 말인것 같다. - 해결책은? 해당 파일을 열고, cmd + shift + s 를 누르면 복제가 되는데 이걸 새로 저장할 때, 알파에 대한 항목을 체크하지 않으면 된다. 이 방법으로 잘 되는 사람도 있겠지만, 난 되지 않았다... 다른 방법으로 위와 같이 복제를 해서 jpeg로 변경, 품질은 최상으로 ..
CATransaction 사용하여 애니매이션되는 속성(트리거 여부, 타이밍, 기간 등)을 설정할 수 있다. 아래 코드는 navigationController에서 pushViewController를 사용하여 화면을 전환할 경우, complete method를 추가하여 사용할 수 있도록 컨트롤러를 확장한 코드이다.// navigationController 확장 extension UINavigationController { // pushViewController 실행후 complete callback 구현 가능하도록 수정 public func pushViewController(viewController: UIViewController, animated: Bool, completion: (() -> Void)?..
- Total
- Today
- Yesterday
- IOS
- Swift
- ssh
- Realm
- AVKit
- Cleancode
- database
- Design Pattern
- AssociatedObject
- HLS
- Coordinator
- carousel
- AVFoundation
- TDD
- testing
- pagingView
- permission error
- UIButton
- Video
- m3u8
- UIControl
- Closure
- BaseViewController
- CollectionView
- UIBarButtonItem
- NIB
- customAlertView
- xib
- RECORDING
- http live streaming
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |