NavigationController
의 NavigationBar
의 isNavigationBarHidden
프로퍼티와 setNavigationBarHidden(_:animated:)
메서드를 사용한 것의 비교만국박람회 프로젝트의 3 번째 단계는 오토레이아웃을 완벽히 적용하는 것이었습니다. 초기 시작화면에 회전에 대한 제약을 주어야 하는 부분에서 큰 시행착오를 겪었지만 AppDelegate
의 application(_:supportedInterfaceOrientationsFor:)
메서드와 필요한 ViewController
에서 AppDelegate
의 인스턴스를 생성하여 화면 전환 방향을 제한하는 방식으로 문제를 해결했습니다. 이 과정에서 AppDelegate
인스턴스 간 순환 참조에 의해 메모리에서 일어날 수 있는 누수 문제를 해결하고자 화면이 이동될 때 참조를 해제해 주었습니다. 이 과정은 어제 TIL에 작성한 내용이지만 LLDB
에 대한 학습이 부족하여 올리지는 못하고 있네요. LLDB
를 학습하고 천천히 업로드하도록 하겠습니다.
접근성 (손쉬운 사용) 조절에 따른 대응을 위해 모든 요소에 Dynamic Type
을 적용하였으며, 테이블 뷰와 상세 화면은 가로 방향 (landscape) 화면 회전을 지원합니다.
초기화면은 세로 방향만 지원합니다 (가로로 들고 있어도 세로로만).
화면을 가로 방향으로 들고 있을 경우 화면 전환 시 가로로 회전하며 초기 화면으로 되돌아 올 경우 다시 세로화면만 지원합니다.
UILabel
에 JSON 파일에서 디코딩한 내용을 텍스트로 넣어두었는데, 줄바꿈이 필요한 요소가 있다고 할 때, 여러분들은 어떻게 하시겠나요? 예를 들어, 아래 이미지에서 제목의 소괄호(
를 기준으로 줄바꿈을 하고 싶다면요?
replacingOccurences(in:with:)
먼저 String
타입에 적용할 수 있는 replacingOccurences(in:with:)
메서드를 활용할 수 있습니다. 목표한 좌측 소괄호를 기준으로 문자열을 변경해줄 수 있겠죠. 아래 코드처럼요!
private func configureTitleLabel(with data: ExpoIntroduction) {
titleLabel.text = data.title
titleLabel.text = titleLabel.text?.replacingOccurrences(in: "(", with "(\n")
}
하지만 기획이 변경되어 소괄호가 아니라 대괄호 혹은 다른 구분 기호로 바뀐다면 이 코드는 변경되어야 하지 않을까요? 그럼 이 레이블 텍스트에서 가장 변경될 가능성이 적은 요소를 기준으로 줄바꿈을 하면 더 좋을 것 같네요.
replacingOccurences(of:with:range:)
+ range(of:)
제가 생각하기에 1900
이라는 내용은 고유한 내용이므로 바뀌지 않을 가능성이 클 것 같습니다. 하지만 1900
을 기준으로 replacingOccurences(in:with:)
메서드를 적용하면 두 번째로 등장하는 1900
이라는 텍스트에도 영향을 미치니 보완할 방법을 찾아야겠습니다. 이렇게 생각해보면 어떨까요?
1900
을 기준으로 줄바꿈을 한다.그럼 첫 번째로 등장하는
이라는 조건을 만족시키기 위해 String
타입의 range(of:)
메서드에 대해 알아봅시다.
range(of:)
메서드는 다른 부가 매개변수들을 활용하여 검색 범위를 달리할 수 있지만 of:
매개변수에만 인자를 전달하면 첫 번째 요소까지의 범위를 반환해줍니다. 그럼 아래와 같이 코드를 완성할 수 있죠.
private func configureTitleLabel(with data: ExpoIntroduction) {
titleLabel.text = data.title
let newLineTargetString = titleLabel.text?.range(of: "1900")
titleLabel.text = titleLabel.text?.replacingOccurrences(
of: "1900",
with: "1900\n",
range: newLineTargetString
)
}
이런 방법들을 적용해볼 수 있지만 가장 좋은 방법은 데이터를 주는 쪽과 협의하는 것이 가장 좋겠죠. 개발자가 자의적으로 판단해서 개발하는 것만큼 리스크가 큰 것도 따로 없을 것입니다.
과거 포스팅을 참고하였습니다~!