iOS/UIKit
-
[UIKit] UITableViewCell 재사용에 대한 실험iOS/UIKit 2022. 8. 23. 23:15
tableview cell의 lifetime 생성 -> 큐에 들어감 -> readyforreuse -> 보임 모든 index에 대해서 셀을 생성하지 않고, 만들어진 셀을 공유함으로써 메모리를 절약할 수 있습니다. 이때 아무리 디버거로 메모리를 들여다봐도 reuseQueue에 어떤 인스턴스가 들어가 있는지 확인할 수 없어서 직접 실험을 통해서 알아봤습니다. 즉 tableviewcell이 어떤 방식으로 재활용되는지 알아보는 간접적인 실험입니다. 제일 처음에는 위와 같이 화면에 보이는 셀들만 생성이 됩니다. 0번째 셀이 완벽하게 들어가지 않은 상황입니다. reuseQueue에 아무것도 없기 때문에, 새로운 cell이 생성됩니다. 이제 0번째 셀이 완벽하게 가려졌습니다. 그렇다면 0번째 셀은 reuseQueue..
-
[UITextField] 일정 포멧에 맞춰서 / 마스크 입혀주기iOS/UIKit 2022. 1. 22. 22:16
뭐라고 설명하기 어려운것 같아서 영상으로 설명을 대신한다. 아래 예시는 전화번호 포멧에 맞춰서 표시형식을 맞춰준 것이다. 간단하게 설명하자면, 텍스트필드 입력값을 받아서 포멧에 맞게 수정한 뒤에 다시 텍스트필드값을 바꿔주는 로직이다. 구현은 아래와 같다. extension String { var decimalFilteredString: String { return String(unicodeScalars.filter(CharacterSet.decimalDigits.contains)) } func formated(by patternString: String) -> String { let digit: Character = "#" let pattern: [Character] = Array(patternStrin..
-
[미세먼지 TIL] 퍼센트값으로 된 line height의 적용iOS/UIKit 2022. 1. 18. 22:12
처음으로 디자이너분들이 작업하신 UI 명세(?)를 Figma로 받아봤다. 그런데 line height에 퍼센트로 표시되어있었다. 그렇지만 Swift에서는 lineHeight의 자료형이 CGFloat이기 때문에 명세에 있는 line height을 어떻게 적용해야 할지 모르겠다. 검색을 통해서는 해결하지 못했고, Figma를 살펴보던 중 값을 계산해보면서 적용방법을 알아낼 수 있었다. lineHeight(px) = fontSize(px) * lineHeight(percent) 즉, 위의 첫번째 예시처럼 font의 fontsize = 20px이고 lineHeight(px) = 160%라면 lineHeight(px) = 32px로 계산할 수 있다.
-
UIButton.Configuration으로 리펙토링 아이디어iOS/UIKit 2022. 1. 14. 00:31
UIButton.Configuration에는 애플에서 사전에 만들어놓은 여러가지 스타일들이 있다. button.configuration = UIButton.Configuration.plain()이런 형태로 쉽게 스타일을 적용할 수 있다. 이걸 토대로 custom style도 쉽게 만들어 리펙토링하면 괜찮을 것 같다. extension UIButton.Configuration { static func style() -> UIButton.Configuration { var configuration = UIButton.Configuration.bordered() configuration.baseForegroundColor = .white configuration.imagePlacement = .bottom c..
-
[UIKit] TableViewCell 내부의 button이 작동하지 않을 때iOS/UIKit 2022. 1. 13. 04:19
Button을 갖는 CustomCell을 만들었을 때, 계속해서 Button의 클릭이벤트가 발생하지 않는 오류를 만났다. 기능적인 오류가 아닌 View 계층적인 문제였다. 아래를 보면 빨간색 박스에 포함된 객체들이 버튼이다. 초록색 박스를 보면 버튼 위에 뷰가 하나씩 더 있는것을 볼 수 있다. 초록색 박스의 정체는 TableViewCell.contentView이다. Cell.addSubview()를 하게되면, Cell과 ContentView사이에 객체가 들어가기 때문에 상호작용이 불가능하다. 따라서 ContentView위에 객체를 추가해주어야 상호작용이 가능하다. TableViewCell.contentView.addSubView()로 contentView위에 객체를 추가해주니 버튼도 잘 눌린다.
-
[UIKit] ScrollView 안에 TableView 넣기iOS/UIKit 2022. 1. 5. 19:40
필수 요소 코드로 구현할 때에는 scrollView의 모든 edge에 대한 constraint가 존재, scrollView안에 contentView가 존재 ( 이번 경우에는 StackView를 사용) contentView의 넓이(스크롤 방향의 수직방향)에 대한 constraint가 존재. tableView의 고유한크기(intrinsicContentSize)를 flexible하게 만들어주어야 함. 참고 https://stackoverflow.com/questions/35028518/how-to-make-uitableview-fit-to-contents-size How to make UITableView fit to content's size I have a UITableView (let's call it ..
-
Storyboard없이 Code로 UI구현하기iOS/UIKit 2021. 12. 28. 23:39
모든 UI를 Code만으로 작성하기 위해서, Main Storyboard를 없애줄 것입니다. ⁉️ Tip 시작하기 전에 간단한 팁을 하나 드리자면, 어떤 기능을 Storyboard에서가 아닌 Code로 구현하고 싶을 때 구글에 programmatically라는 키워드를 통해 검색하면 조금 더 유용한 정보를 얻을 수 있습니다! 총 3단계를 거치게 됩니다. 첫 번째, Storyboard를 제거해줍니다. Storyboard를 모두 제거한다고, LaunchScreen까지 제거하면 안 됩니다.. LaunchScreen을 코드로 작성해도 되나? 의 대답은 NO라고 하네요 두 번째, Target의 Main Inferface를 지우고, Info.plist의 Storayboard Name을 삭제해줍니다. Main Int..
-
UIKit과 DispatchQueue.main의 관계 / 실제 예시를 통해 알아보기iOS/UIKit 2021. 12. 26. 23:41
InfoView - shadowLayer - StackView - textLabel - tagLabel - descriptionLabel 위와 같은 계층 구조를 갖고 있는 InfoView가 있다. 초기 화면 구성시 동작 순서는 다음과 같다. 1. API를 통해 받아온 데이터를 InfoView에 대입해준다. 2. 데이터를 대입해줌에 따라서, StackView의 크기가 바뀔 것이다. 3. InfoView의 bound에 맞춰서 shadow를 적용하는 updateShadow() 메서드가 실행된다. 그러나 왼쪽 화면과 같이 bounds가 제대로 계산되지 않고 shadow가 적용된 것을 볼 수 있다. 각 함수들에 `height`을 출력하는 프린트문을 넣어서 디버깅 해보면 결과는 아래와 같다. public func ..