[TIL] 21.04.16.(Fri)

Ryan (Geonhee) Son·2021년 5월 2일
0

활동 요약

  • Step 3 PR
    • 실행화면
  • 문자열 교체
    • 첫 번째 문자열 범위 구하기
  • NavigationControllerNavigationBarisNavigationBarHidden 프로퍼티와 setNavigationBarHidden(_:animated:) 메서드를 사용한 것의 비교

활동 상세

Step 3 PR

만국박람회 프로젝트의 3 번째 단계는 오토레이아웃을 완벽히 적용하는 것이었습니다. 초기 시작화면에 회전에 대한 제약을 주어야 하는 부분에서 큰 시행착오를 겪었지만 AppDelegateapplication(_:supportedInterfaceOrientationsFor:) 메서드와 필요한 ViewController에서 AppDelegate의 인스턴스를 생성하여 화면 전환 방향을 제한하는 방식으로 문제를 해결했습니다. 이 과정에서 AppDelegate 인스턴스 간 순환 참조에 의해 메모리에서 일어날 수 있는 누수 문제를 해결하고자 화면이 이동될 때 참조를 해제해 주었습니다. 이 과정은 어제 TIL에 작성한 내용이지만 LLDB에 대한 학습이 부족하여 올리지는 못하고 있네요. LLDB를 학습하고 천천히 업로드하도록 하겠습니다.

작동 화면

접근성 (손쉬운 사용) 조절에 따른 대응을 위해 모든 요소에 Dynamic Type을 적용하였으며, 테이블 뷰와 상세 화면은 가로 방향 (landscape) 화면 회전을 지원합니다.

초기화면은 세로 방향만 지원합니다 (가로로 들고 있어도 세로로만).
ezgif com-video-to-gif (4)

화면을 가로 방향으로 들고 있을 경우 화면 전환 시 가로로 회전하며 초기 화면으로 되돌아 올 경우 다시 세로화면만 지원합니다.
ezgif com-resize (1)

첫 번째로 등장하는 문자열을 찾아 바꾸기

UILabel에 JSON 파일에서 디코딩한 내용을 텍스트로 넣어두었는데, 줄바꿈이 필요한 요소가 있다고 할 때, 여러분들은 어떻게 하시겠나요? 예를 들어, 아래 이미지에서 제목의 소괄호(를 기준으로 줄바꿈을 하고 싶다면요?


1. 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")
}

하지만 기획이 변경되어 소괄호가 아니라 대괄호 혹은 다른 구분 기호로 바뀐다면 이 코드는 변경되어야 하지 않을까요? 그럼 이 레이블 텍스트에서 가장 변경될 가능성이 적은 요소를 기준으로 줄바꿈을 하면 더 좋을 것 같네요.

2. 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
  )
}

이런 방법들을 적용해볼 수 있지만 가장 좋은 방법은 데이터를 주는 쪽과 협의하는 것이 가장 좋겠죠. 개발자가 자의적으로 판단해서 개발하는 것만큼 리스크가 큰 것도 따로 없을 것입니다.

내비게이션 바를 숨길 때 프로퍼티와 메서드 간 비교

과거 포스팅을 참고하였습니다~!

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글