일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 리펙터링
- UITextView
- Observable
- combine
- Refactoring
- 스위프트
- ios
- 클린 코드
- Clean Code
- Protocol
- 애니메이션
- uitableview
- tableView
- uiscrollview
- swiftUI
- RxCocoa
- Human interface guide
- map
- 리팩토링
- HIG
- rxswift
- MVVM
- SWIFT
- 리펙토링
- collectionview
- Xcode
- clean architecture
- ribs
- UICollectionView
- swift documentation
- Today
- Total
목록분류 전체보기 (1644)
김종권의 iOS 앱 개발 알아가기
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bIY2AP/btre6EuSmqj/KY4gEp6vAtJec1TrOnZLU1/img.gif)
커스텀 팝업 창 구현 아이디어 UIViewController를 상속받아서 backgroundColror는 어둡게하고, 그 위에 customView를 띄우는 방식 present로 통째로 띄우면 팝업이 표출되는 현상처럼 보이는 것을 활용 사용할때마다 객체로 만들며, UIViewController의 extension으로 넣고 ViewController에서 호출하여 사용 팝업을 띄우는 PopUpViewController 구현 필요한 stored property 프로퍼티 모두 optional로 설정하고 생성자에서 값을 받아서 초기화 > 만약 nil값이면 팝업 view에 addSubview를 하지 않게하여 표출되지 않게끔 설정 class PopUpViewController: UIViewController { pri..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/o8bYq/btqOvdKdPfk/8ZCxvFhdzPazAoFUuM4szk/img.png)
구조 main과 sub항목으로 나눔 main항목 하나는 하나의 section으로 구성 (하위들의 데이터: main, sub1, sub2, ...) (main1, sub1, sub2) 를 하나의 section으로 두면 인터렉션 관리에 용이하기 때문에 section으로 구성 main선택 -> 하위 sub모두 체크하기 쉬움 인터렉션 "위 내용에 모두 동의합니다" 선택: 모든 버튼 체크 / 해제 "필수"항목 누른 경우, 동의하기 버튼 활성화 모든 항목 선택 -> 위 내용에 모두 동의합니다 활성화 sub항목 존재하는 main항목 선택 -> sub 항목 모두 체크 sub항목이 존재하는 항목중에 sub항목 모두 체크 -> main항목 체크 Custom cell Hugging, compression값 설정: (필수)의..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c5dDxK/btqOhNM7SZK/HWWNigbczy5gfVWTkkVrN0/img.gif)
해당 프레임 워크가 좋은 이유 비동기 처리할 때 다른 로딩 뷰에 비해서 오류 x 로딩 뷰가 등장하면 뒤에있던 뷰들을 클릭하지 못함(안전상태) 자동으로 중앙에 배치 의존성 pod 'JGProgressHUD' BaseViewController생성하여 여기에 로딩관련 로직 추가 ( 재사용성을 위함 ) // // BaseViewController.swift // Test // // Created by 김종권 on 2020/11/26. // import Foundation import UIKit import JGProgressHUD class BaseViewController: UIViewController { lazy var hud: JGProgressHUD = { let loader = JGProgressHU..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bCdlbU/btqOoMy7SG8/7KP26GDbq5FxX5wKikgSYk/img.png)
디버깅 팁 print()하여 디버깅 하는 것보다, break포인트를 걸고 po로 확인하는 방법이 가장 단순하고 불필요한 코드가 생기지 않는 방법 버튼을 눌렀을 때, 값 디버깅 방법 // // ViewController.swift // Test // // Created by 김종권 on 2020/11/26. // import UIKit class ViewController: UIViewController { var variableValue = 0 var sampleData = (1, 2, 3) @IBOutlet weak var btn: PrimaryButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup afte..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/w3UUV/btqOhOkXMdt/tLTvoLPycxa0UOAkPvX790/img.gif)
의존성 pod 'MaterialComponents/ActivityIndicator' 버튼 커스텀 위 loading기능을 쓰려는 버튼들은 아래의 BaseButton을 상속받아서 사용 // // BaseButton.swift // Test // // Created by 김종권 on 2020/11/26. // import Foundation import MaterialComponents.MaterialActivityIndicator class BaseButton: UIButton { var activityIndicator: MDCActivityIndicator? var originalText: String? override init(frame: CGRect) { super.init(frame: frame) s..
초기화의 핵심 초기화 종류는 2가지 (Designated, convenience) 초기화의 목적: 모든 멤버 초기화 (1단계) + 상속받은 멤버들 customizing (2단계) Designated initializer (지정 초기자) 클래스의 모든 프로퍼티를 초기화 해야함 클래스 타입은 반드시 한 개 이상의 지정 초기자가 필요 init(parameters) { statements } Convenience initializer (편의 초기자) 옵셔널 Convenience init 내부에서 반드시 Designated Init이 호출되어야 함 (self.init()) convenience init(parameters) { self.init() statements } 초기화 규칙 - 모든 멤버가 초기화 되어야..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bmKPJc/btqN9N5ZBiQ/2Al3Aut3i9FCecKqLlYCNK/img.png)
AttributedString과 String의 차이 String은 단순히 text만 존재 AttributedString은 text에 attribute(속성 - Font, color, style등)이 추가 된 것 코드로 String의 attribute를 지정할 수 있는 장점 Label에 strike속성을 코드로 넣기 String의 extension으로 넣어서 사용 func strikeThrough() -> NSAttributedString { let attributeString: NSMutableAttributedString = NSMutableAttributedString(string: self) attributeString.addAttribute(NSAttributedString.Key.striketh..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wxJvj/btqN02p98Ni/YkA3JVpotCkuGUnM7OkEoK/img.png)
View를 이미지로 변환 & 공유하기 View를 UIImage로 변환 extension UIView { func transfromToImage() -> UIImage? { UIGraphicsBeginImageContextWithOptions(bounds.size, isOpaque, 0.0) defer { UIGraphicsEndImageContext() } if let context = UIGraphicsGetCurrentContext() { layer.render(in: context) return UIGraphicsGetImageFromCurrentImageContext() } return nil } } 이미지 공유하기 let vc = UIActivityViewController(activityIte..