일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- uitableview
- tableView
- swiftUI
- collectionview
- Xcode
- 애니메이션
- RxCocoa
- 리펙터링
- 리펙토링
- UITextView
- uiscrollview
- MVVM
- 스위프트
- UICollectionView
- 리팩토링
- Refactoring
- 클린 코드
- map
- Clean Code
- SWIFT
- combine
- Protocol
- ribs
- swift documentation
- rxswift
- Observable
- clean architecture
- HIG
- Human interface guide
- ios
- Today
- Total
목록iOS 응용 (swift) (680)
김종권의 iOS 앱 개발 알아가기
cocoapod pod 'AnyFormatKit' 구현 import import AnyFormatKit 델리게이트 함수에 적용 textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 예제1) 폰 번호 포맷 - 010-1234-2134 extension ViewController: UITextFieldDelegate { func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { guard..
원리 Date()라는 것을 사용하여, 화면이 처음 등장한 시간 때를 기록 Timer의 scheduler에서 현재 시간과, 위의 기록된 시간을 비교하여 시간이 얼마나 지났는지 체크 위와 같이 하면, 사용자가 background에 갔다와도 시간이 흐른만큼 Timer에 반영 주요 코드 Timer객체를 전역에 선언 (Timer가 필요없을 때 invalidate시켜주기 위함) var timer = Timer() ... deinit { timer.invalidate() } 처음 화면이 들어난 시간을 기록하기 위해 Date형의 변수를 전역에 선언 var startTime: Date? Timer로직 함수 private func setTimer(startTime: Date) { DispatchQueue.main.asyn..
커스텀 팝업 창 구현 아이디어 UIViewController를 상속받아서 backgroundColror는 어둡게하고, 그 위에 customView를 띄우는 방식 present로 통째로 띄우면 팝업이 표출되는 현상처럼 보이는 것을 활용 사용할때마다 객체로 만들며, UIViewController의 extension으로 넣고 ViewController에서 호출하여 사용 팝업을 띄우는 PopUpViewController 구현 필요한 stored property 프로퍼티 모두 optional로 설정하고 생성자에서 값을 받아서 초기화 > 만약 nil값이면 팝업 view에 addSubview를 하지 않게하여 표출되지 않게끔 설정 class PopUpViewController: UIViewController { pri..
구조 main과 sub항목으로 나눔 main항목 하나는 하나의 section으로 구성 (하위들의 데이터: main, sub1, sub2, ...) (main1, sub1, sub2) 를 하나의 section으로 두면 인터렉션 관리에 용이하기 때문에 section으로 구성 main선택 -> 하위 sub모두 체크하기 쉬움 인터렉션 "위 내용에 모두 동의합니다" 선택: 모든 버튼 체크 / 해제 "필수"항목 누른 경우, 동의하기 버튼 활성화 모든 항목 선택 -> 위 내용에 모두 동의합니다 활성화 sub항목 존재하는 main항목 선택 -> sub 항목 모두 체크 sub항목이 존재하는 항목중에 sub항목 모두 체크 -> main항목 체크 Custom cell Hugging, compression값 설정: (필수)의..
해당 프레임 워크가 좋은 이유 비동기 처리할 때 다른 로딩 뷰에 비해서 오류 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..
의존성 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..
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..
기본개념은 여기 참고 DataModel추가 새로 만들기에서 Data Model추가 완성된 화면 "Add Entity"눌러서 엔터티 추가: 중요한 것은 Data형태의 updateDate를 추가 (이 데이터는 나중에 addData할 때 같은 데이터가 있으면 date만 업데이트하는 용도로 사용 될 것) Entity이름 수정 Codegen을 Menual/None으로 변경: Class Definition으로 두면 오류 발생 "Mutiple commands produce '...' " 생성된 .xcdatamodeld 클릭 > Xcode의 menu바에서 Editor -> "Create NSMagedObject Subclass"선택하여 클래스 생성 두 가지 파일 생성 완료: Person+CoreDataClass, Pe..