[TIL #20] 2023 / 05 / 01 앨범에서 이미지를 불러오는 작업을 하는데, 사진을 추가할 때마다 메모리 사용량이 기하급수적으로 증가하더라고요. 그래서 오늘은 간단히 이미지 관련, 메모리 최적화 방법에 대해서 알아보려고 합니다. WWDC 18(iOS Memory Deep Dive) 와 WWDC18(Image and Graphics Best Practices) 를 참고해 정리하였습니다. 메모리 사용량은 이미지의 파일의 크기로 계산되는 게 아닙니다. 메모리 사용량 ≠ 파일의 크기 바로 이미지의 크기(해상도)로 메모리가 계산이 됩니다. 계산 공식은 이와 같습니다. (Assets @1x 크기 기준) 메모리 사용량 ≈ 해상도(가로 pixels * 세로 pixels) * 4byte per pixel 대..
[Swift/TIL #19] 2023 / 04 / 30 저번에는 글자 수에 따라, 동적으로 작용하는 셀을 만들어봤습니다. [Swift/TIL #18] UICollectionViewCompositionalLayout으로 Cell의 크기를 동적으로 만들어 보자 (더보기 버튼) 여기서 조금 더 조건을 추가하면, 텍스트가 3줄 이상일 때, 더 보기 버튼이 생성되도록 만들 수 있을 것 같습니다. 그러려면 먼저, 현재 텍스트의 줄 수를 알아야겠죠? 텍스트의 줄 수를 구하는 코드를 알아봅시다. 코드를 보면 (전체 텍스트 높이)와 (글자 폰트의 높이)로 글의 줄 수를 유추하는 것 같네요. extension UILabel { // https://stackoverflow.com/questions/28108745/how-t..
[TIL #18] 2023 / 04 / 28 오늘은 CompositionalLayout에서 Cell의 크기를 동적으로 조절해 보려고 합니다. 기본 사용방법은 [Swift/TIL #13] CollectionView의 CompositionalLayout 를 참고하세요. 시작 이와 같이 더 보기 버튼이 있는 컬렉션뷰를 만들어 보려고 합니다. 일단 레이블의 numberOfLines는 3줄로 제한을 걸어두고, 더 보기를 버튼을 클릭하면 나머지 글 전부를 볼 수 있게 만들 예정입니다. 먼저 셀 코드를 확인해 봅시다. 레이블과 버튼이 있는 Cell을 만들어 줬습니다. 그리고 버튼이 동작 시 델리게이트로 넘겨줘서 Label을 바꿔줄 예정입니다. protocol DynamicCustomCellDelegate: AnyOb..
[TIL #17] 2023 / 04 / 19 오토 레이아웃을 잡고 객체의 frame을 사용하려 하는데, 한번 애를 먹었던 기억이 있어, 오늘은 이렇게 Update Clycle의 viewDidLayoutSubviews를 한번 간단히 정리하고 넘어가려고 합니다. 일단 Life Cycle + Update Cycle를 그림으로 한번 보고 가시죠. 각 Cycle 마다, 역할이 조금씩 다릅니다. 각 시점마다 무슨일이 일어나는지 알고나면 프로젝트를 만들 때, 도움이 많이 되더라고요. viewDidLayoutSubviews 말 그대로 "UIVIew" 객체가 모든 서브뷰들의 레이아웃을 변경한 후에 호출되는 메서드입니다. 다른 메서드와 달리, 뷰와 서브뷰들의 레이아웃이 모두 정해진 후 호출되는 메서드입니다. 다른식으로 말..
[TIL #16] 2023 / 04 / 18 버튼에 그림자 효과를 주고 싶어 Layer의 그림자 설정을 사용하고 있는데, 보라색 경고를 마주쳤습니다. 일단 코드부터 보시죠. func configButton() { button.layer.cornerRadius = button.bounds.width / 2 button.layer.shadowColor = UIColor.red.cgColor button.layer.shadowOffset = CGSize(width: 0, height: 1) button.layer.shadowOpacity = 0.9 button.layer.shadowRadius = 10 } 이와 같이 사용하니, 아래와 보라색 경고가 발생했습니다. The layer is using dynamic..
[TIL #15] 2023 / 04 / 17 UIMunu는 iOS 13부터 추가된 기능입니다. 특정 오브젝트를 길게 누르거나, 특정 제스처에 나타나는 메뉴 커스터마이징 할 수 있습니다. 한번 UIMenu에 대해 간단히 알아봅시다. UIMenu 일단 UIMenu 생성자를 확인하고 들어가겠습니다. 이미 Zedd님 이 설명을 잘해두셨네요. 이렇게 UIMenu의 생성자가 있고, 안쪽 파라미터에서 children 제외한 나머진 생략이 가능합니다. 여기서 children은 UIMenuElement로 돼있습니다. children을 만들 때, 주의점으로는 UIMenuElement로 직접 객체를 만들어 사용하면 안 되고, 클래스 UIMenu, UIAction, UICommand로 객체 만들어 사용해줘야 합니다. 나머지..
[TIL #14] 2023 / 04 / 14 이전에 커스텀 탭바 를 구현했었습니다. 그때는 몰랐지만 컬렉션뷰와 같은 스크롤 기능이 추가된다면, 기존의 TabBar의 영역이 그림자로 반투명하게 나타는 문제가 발생했습니다. 이유를 찾아보니 iOS 13부터는 Bar 설정할 땐, UITabBarAppearance를 통해 변경해줘야 하더라고요. 당연히 예전 API들도 같이 사용 가능하지만, 아쉽게도 여기엔 Bar의 반투명 영역에 대한 설정이 없습니다. 굳이, 사용하려면 TabBar의 Background 이지미를 설정한 뒤 Alpha를 0으로 바꾸면 될까요? 그런데 이런 비슷한 문제를 이전 UINavigationBar에서도 겪었는데요. UINavigationBarAppearance의 적용법과 UITabBarAppe..
[TIL #13] 2023 / 04 / 12 ~ 2023 / 04 / 13 저번에 공부한 FlowLayout 에 이어서, 오늘은 복잡한 레이아웃도 쉽게 구현할 수 있도록 도와주는 CompositionalLayout에 대해서 알아봅시다. 공식문서 예제 를 참고해서 만들었습니다. CompositionalLayout 기본 CompositionalLayout은 으로 구성돼 있습니다. 이 각각의 요소들로 조합하여, 원하는 레이아웃으로 구성할 수 있죠. 일단 CompositionalLayout의 레이아웃 생성 메서드들을 먼저 살펴봅시다. UICollectionViewCompositionalLayout(section:) UICollectionViewCompositionalLayout(section:, configur..
[TIL #12] 2023 / 04 / 11 분명히 이전에 CollectionView를 사용해 봤는데, 오랜만에 다시 만드려니까 헷갈리더라고요. 이번 기회에 다시 간단히 정리를 하려고 합니다. FlowLayout 흐름 있는 레이아웃? 간단하게 Grid형태의 레이아웃을 쉽게 구성할 수 있도록 도와는 클래스입니다. 일단 공식문서는 여기 있습니다 https://developer.apple.com/FlowLayout https://developer.apple.com/UICollectionviewFlowlayout FlowLayout의 Cell은 이런 순으로 배치됩니다. FlowLayout의 속성들을 알아봅시다. func createFlowLayout() -> UICollectionViewFlowLayout { ..
[TIL #11] 2023 / 04 / 10 오늘은 TextField를 클릭하면 DatePicker가 나오게 만들어 볼 예정입니다. 버튼 동작을 위해 UIToolBar까지 추가해서 만들어 봅시다. 이전에 NavigationController 계층에 있는 ToolBar도 만들어봤습니다. [iOS/Swift] NavigationController의 ToolBar를 코드로 만들어 봅시다 이번엔 NavigationController 계층에 속해있는 ToolBar가 아닌 직접 객체를 만들어 사용해 보겠습니다. 설명은 주석이랑 사진으로 때우겠습니다. 시작 먼저 텍스트 필드를 생성해 줍시다. let textField: UITextField = { let field = UITextField() field.backgro..
시작 sizeToFit와 sizeThatFits 두 메서드 모두 해당 콘텐츠에 따라 자동으로 크기를 조절해 주는 메서드입니다. 간단한 예제와 함께 빠르게 설명하고 끝내겠습니다. sizeToFit 간단히 설명하면, 뷰가 현재 포함하고 있는 콘텐츠에 맞게 크기를 조절합니다. 예를 들어, Label이 있다고 해봅시다. let textLabel: UILabel = { let label = UILabel() label.numberOfLines = 0 label.backgroundColor = .secondarySystemBackground label.text = "안녕하세요" + "\n" + "저는 현재 iOS 공부중입니다." + "\n" + "가자" return label }() override func vie..
시작 NavigationController의 ToolBar를 코드로 만들어 봅시다. ToolBar도 NavigationBar와 만드는 방법이 비슷하더라고요. 참고로 ToolBar와 TabBar는 완전히 다른 기능을 하는 클래스입니다. 또한 TabBar는 UINavigationController에 속해 있지도 않고요. 여기서는 ToolBar를 만들 거예요! 한번 만들어 봅시다. ToolBar ToolBar 만드는 방법은 1. UINavigationController의 계층에 있는 ToolBar를 사용 2. 직접 UIToolBar 만들어 주는 방법이 있습니다. 오늘은 UINavigationController를 통해 ToolBar를 구현해 보겠습니다. 일단 ToolBar를 사용하기 위해선 당연히 UINavig..
[TIL #10] 2023 / 04 / 09 프로젝트에서 스크롤뷰를 사용 중인데, 문제가 발생했습니다. 현재 상황은 스크롤 뷰 안쪽에 스택뷰를 배치하고, 스택뷰의 레이아웃을 스크롤 뷰의 중심으로 맞춰서 모양을 만들어 줬습니다. self.addSubview(photoScrollView) photoScrollView.snp.makeConstraints { $0.top.equalTo(photoLabel.snp.bottom).offset(titleGap-space) $0.trailing.leading.equalToSuperview().inset(sideInset) $0.height.equalTo(imageSize+space) } photoScrollView.addSubview(photoStackView) pho..
[TIL #9] 2023 / 04 / 03 ~ 2023 / 04 / 06 사진을 가져오려 하는데 iOS 14 이상부터는 UIImagePickerController 대신 PHPickerViewController를 사용하라고 하더라고요. 그래서 오늘은 PHPickerViewController에 대해서 알아보겠습니다. PHPickerViewController 공식 문서 링크 PhotoKit WWDC2021 정보가 많이 없어 공식문서와 WWDC를 참고해서 만들어 봤습니다. 틀린 내용 있으면 댓글 부탁드려요! 한번 간략하게 설명해 보겠습니다. PHPickerViewController는 iOS 14에서 새로 추가됐고 기존에 사용하던 UIImagePickerController와 같이 이미지나 비디오 같은 미디어들을 ..
시작 간단히 할 예정이라 먼저 초스피드로 뷰 컨트롤러의 Life Cycle을 알아봅시다. 뷰컨의 Life Cycle의 순서 loadView 뷰를 생성합니다. (시스템에서 자동 호출) ⬇ viewDidLoad 뷰가 로드되고 작업을 수행 (앱이 실행되고 오직 한 번만 작업을 수행) ⬇ viewWillAppear 뷰가 화면에 나타나기 직전 준비 작업을 수행 (뷰컨으로 다시 되돌아올 때마다 작업을 다시 수행) ⬇ 뷰가 화면에 나타남 ⬇ viewDidAppear 뷰가 화면에 나타난 후 작업을 추가적으로 수행 ⬇ viewWillDisappear 뷰가 화면에서 사라지기 전에 마무리 작업을 수행 (메모리는 아직 존재) ⬇ 뷰가 화면에서 사라짐 ⬇ viewDidDisappear 뷰가 화면에서 완전히 사라진 후 작업을 수..