KWiOS
KWiOS0101
KWiOS
  • 분류 전체보기 (108)
    • Algorithm (41)
      • 이코테 (14)
      • 이코테 문제풀이 (21)
      • 프로그래머스 (6)
    • CS (1)
      • 모두를 위한 컴퓨터 과학(CS50 2019) (0)
    • iOS (15)
    • Swift (36)
      • Swift문법 (32)
      • 기타 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 6

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
KWiOS

KWiOS0101

iOS

UINavigationBar TitleView Swipe-Back 했을때 Width 커지는 현상

2022. 10. 24. 00:02

문제 상황 

navigationBar를 커스텀하던중 backButton과 searchBar를 사용하기위해 아래와 같이 구현하였다.

override func viewDidLoad() {
    super.viewDidLoad()
        
    let textField = UITextField()
    textField.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)
    textField.backgroundColor = .white
        
    self.navigationItem.titleView = textField
}
swipe-back으로 뒤로갔다 다시 원래 VC로 이동했을때 titleView가 커졌다 작아진다.

위 문제를 해결하기 위해서

containerView를 만들고 그 안에 searchBar를 추가한 다음 제약조건을 주고, containerView를 titleView에 넣어주었다.

override func viewDidLoad() {
    super.viewDidLoad()

    let container = UIView()
    container.backgroundColor = .clear
        
    container.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)
        
    let searchBar = UISearchBar()
    searchBar.translatesAutoresizingMaskIntoConstraints = false
    container.addSubview(searchBar)
        
    let left: CGFloat = 35
    let right: CGFloat = 35
    let width = view.frame.width - left - right
    let offset = -20
        
    NSLayoutConstraint.activate([
        searchBar.topAnchor.constraint(equalTo: container.topAnchor),
        searchBar.bottomAnchor.constraint(equalTo: container.bottomAnchor),
        searchBar.centerXAnchor.constraint(equalTo: container.centerXAnchor, constant: -CGFloat(offset)),
        searchBar.widthAnchor.constraint(equalToConstant: width)
    ])
        
    self.navigationItem.titleView = container
}

 

이번에는 원하는대로 searchBar는 더이상 커지지 않았지만 텍스트를 입력하기위한 터치가 먹히지 않았다. 

구글 검색으로 원인을 찾아보니 titleView안에 새로운 UIView들을 넣어 줬을때 titleView가 사라지고 터치 이벤트도 먹히지 않는다고 한다. 이를 확인해보기위해서 로그를 찍어보았다.

titleView의 width값은 0.0이고, searchBar의 frame의 width값은 358.0인것을 확인할 수 있었다. 

 

문제 해결

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationItem.titleView?.translatesAutoresizingMaskIntoConstraints = false
}
    
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    self.navigationItem.titleView?.translatesAutoresizingMaskIntoConstraints = true
}

viewWillAppear에서 titleView의 translatesAutoresizingMaskIntoConstraints을 false로,

viewWillDisappear에서 titleView의 translatesAutoresizingMaskIntoConstraints를 true로 해주면 간단하게 해결된다.

문제 해결!!

 

 

 

 

'iOS' 카테고리의 다른 글

iOS - 커스텀뷰를 테이블뷰와 비슷하게 사용하기  (0) 2023.07.11
iOS - 텍스트의 특정 부분만 Bold 처리하기  (0) 2023.06.11
NavigationController 사용시 status Bar Style 바꾸기  (0) 2022.12.15
navigationBar + scrollView를 함께 사용할때 top 여백 없애는 방법  (2) 2022.12.01
UICollectionViewCompositionalLayout에서 Cell 동적 높이 적용하기  (0) 2022.11.01
    'iOS' 카테고리의 다른 글
    • iOS - 텍스트의 특정 부분만 Bold 처리하기
    • NavigationController 사용시 status Bar Style 바꾸기
    • navigationBar + scrollView를 함께 사용할때 top 여백 없애는 방법
    • UICollectionViewCompositionalLayout에서 Cell 동적 높이 적용하기
    KWiOS
    KWiOS

    티스토리툴바