💡 카메라
권한: 촬영, 갤러리, 마이크
ImagePickerControlller → deprecated 예정
⇒ PHPicker
🔎 갤러리에 접근하기
- 인스턴스 가져오기
let picker = UIImagePickerController()
photoLibrary, savedPhotosAlbum → will be deprecated
camera는 아직 사용 가능
- available - 갤러리에 접근할 수 있는지 권한
단독으로 사진만 가져오고 싶다 → 권한 안물어봐도 됨
민감한 데이터 혹은 정보 사용 등 경우 권한 물어봐야 함
⇒ 갤러리를 가지고 오는 권한과 갤러리 내 데이터 사용하는 권한은 다름!
UIImagePickerController는 navigationController를 상속받아 사용한다.
✅ 사진을 선택하여 뷰에 띄우기
취소 버튼과 사진 선택 구현
미디어에 대한 정보 선택이 끝났을 때 해줘야하는 내용 작성
InfoKey로 다양한 타입의 사진 접근이 가능함
여러 사진을 선택해야 한다면 PHPicker 사용하는 것이 좋음
🔎 카메라
카메라는 민감한 정보를 다루는 것이기 때문에 권한 체크가 필요함
시뮬에서는 카메라 작동이 안된다.
originalImage로 설정했기 때문에 편집 사진이 적용 안된다
→ editedImage로 설정 바꾸기
✔️ UIFontPickerViewController / UIColorPickerViewController
💡 Generic
Generic: 타입에 유연하게 대응하기 위한 요소
제네릭으로 구현한 타입과 기능은 재사용 하기도 쉽고, 코드의 중복도 줄일 수 있기 때문에 깔끔하고 추상적인 표현이 가능하다.
같은 기능의 함수지만 타입 때문에 여러번 구현해야 하는 불편함
Jack이라는 제네릭 타입으로 선언
매개변수 값이 bool 값과 같이 연산이 불가능 할 수도 있다
연산이 가능한 타입이 들어와야 함을 지정해줌
UIView 타입이 들어와야 함을 명시
✅ T (Type Parameters)
제네릭 타입은 대체로 “T”를 사용
타입의 종류를 알려주지 않지만, 모두 같은 타입이 들어갈 것을 암시한다. 플레이스 홀더와 같은 역할을 한다.
타입 파라미터를 여러 개 쓸 경우 그 다음 많이 사용하는 이름
“U” → UpperCased
✅ Type Constraints
타입에 제약을 설정할 수 있다
클래스 제약이나 프로토콜 제약으로 type constraints를 지정
💡 화면 전환코드 제네릭으로 구현하기
⇒ T를 함수 내에서 사용하지 않아서 뜨는 문구임!
메타 타입으로 확장
“고래밥” > String
String.self > String.Type
메타 타입 정의
클래스의 인스턴스를 넘기는 것이 아니라 클래스 자체를 넘겨주기
💡 메인 스토리보드 없이 실행하기
✅ 메인 스토리보드 삭제
✅ 스토리보드 관련 내용 삭제하기
info.plist
Target - Build Settings
✅ SceneDelegate에서 시작 화면 지정하기
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let scene = (scene as? UIWindowScene) else { return } window = UIWindow(windowScene: scene) let vc = CustomViewController() window?.rootViewController = vc window?.makeKeyAndVisible() }
💡 init ( override / required)
✅ override init
init → UIView에 정의됨
Interface Builder를 사용하지 않고, UIView를 상속 받은 Custom Class를 코드를 구성할 때 사용되는 초기화 구문
✅ required init
required Initializer: 프로토콜에서 생성한 초기화 구문이라는 것을 나타내기 위한 키워드
NSCoder에 정의 된 init
- 스토리 보드와 같이 쓸 때는 uinib을 변환하여 사용하기 때문에 required init이 사용되고,
코드 베이스로 UI를 구성할 때는 override init을 사용한다.
- XIB → NIB 변환 과정에서 객체 생성 시 필요한 init 구문(storyboard)
- NSCoder가 담당함
- Interface Builder에서 생성된 view들이 초기화 될 때 실행되는 구문
📍 required init은 코드베이스로 사용할 때도 필수적으로 코드를 작성해야 하는 것이 디폴트
하지만 실행되면 안됨
‘?’로 실패할 수 있는 생성자임을 명시해준다.
💡 SnapKit TableView
시스템 셀 사용하기
UITableViewCell MetaType을 이용하여 등록
셀 높이 유동적으로 쓰기
- automaticDimension
- numberOfLines
- Layout
고정높이 x, 상하좌우 오토레이아웃
셀이 컨텐츠 크기에 따라 높이가 늘어난 것을 확인한 후 구현
var isExpand = false
각 셀 마다 isExpand 값을 가지고 있어야 함
구조체 내에 isExpand 저장 프로퍼티를 만들어서 선택한 셀만 갱신하기
테이블 뷰 전체 갱신이 아닌 테이블 뷰 셀만 갱신하기
tableView.reloadRows(at: IndexPath(row: 3, section: 0), with: .automatic)
section과 row를 특정하여 해당 셀만 갱신할 수 있다.
🤦♀️
더보기가 잘 안되었던 이유가 아니었을까..
'iOS > 🌱 SeSAC' 카테고리의 다른 글
23.08.28 월 (0) | 2023.08.31 |
---|---|
23.08.25 금 (0) | 2023.08.31 |
23.08.23 수 (0) | 2023.08.31 |
23.08.22 화 (0) | 2023.08.31 |
23.08.21 월 (1) | 2023.08.27 |