[ios] UISearchBar는 iOS 11에서 탐색 모음 높이를 높입니다.

나는 UISearchBar내비게이션 바의 일부가 다음과 같습니다.

 let searchBar = UISearchBar()
 //some more configuration to the search bar
 .....
 navigationItem.titleView = searchBar

업데이트 후 iOS 11내 앱의 검색 창에 이상한 일이 발생했습니다. 에 iOS 10전에 나는 나의 탐색 바처럼 보이는했다 :

여기에 이미지 설명 입력

이제 iOS 11내가 가지고 있습니다.

여기에 이미지 설명 입력

보시다시피 두 검색 막대의 반올림에 차이가있어 나를 괴롭히지 않습니다. 문제는 검색 막대가 탐색 막대의 높이를 증가 시킨다는 것입니다. 따라서 다른 컨트롤러로 이동하면 이상하게 보입니다.

여기에 이미지 설명 입력

사실 이상한 검은 색 선의 높이에 현재 탐색 모음의 높이를 더한 것이 두 번째 그림에 표시된 탐색 모음의 높이와 같습니다.

검은 선을 제거하고 모든 뷰 컨트롤러에서 일관된 탐색 모음 높이를 갖는 방법에 대한 아이디어가 있습니까?



답변

두 가지 경우에 iOS 11에서 SearchBar가있는 NavigationBar 아래에 검은 색 선이 표시됩니다.

  • UISearchBar로 ViewController에서 다른 ViewController를 푸시했을 때
    여기에 이미지 설명 입력

  • UISearchBar로 ViewController를 닫았을 때 “오른쪽 끌기”
    여기에 이미지 설명 입력

내 솔루션은 UISearchBar를 사용하여 내 ViewController에이 코드를 추가하는 것입니다.

-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    [self.navigationController.view setNeedsLayout]; // force update layout
    [self.navigationController.view layoutIfNeeded]; // to fix height of the navigation bar
}

Swift 4 업데이트

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout() // force update layout
    navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
}


답변

iOS 11의 검색 창에 높이 44 제약 조건을 추가 할 수 있습니다.

// 빠른

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}

// 목표 -C

if (@available(iOS 11.0, *)) {
    [searchBar.heightAnchor constraintEqualToConstant:44].active = YES;
}


답변

나는 iOS 11 UISearchBar의 높이가 56과 같고 UINavigationBar는 자동 레이아웃을 사용하여 하위 뷰에 맞게 높이를 높입니다. iOS 11 이전과 같이 UISearchBar를 titleView로 사용하고 싶다면 UISearchBar를 사용자 정의 뷰에 포함하고이 뷰의 높이를 44로 설정 한 다음 navigationItem.titleView에 할당하는 것이 가장 좋은 방법임을 알았습니다.

class SearchBarContainerView: UIView {

    let searchBar: UISearchBar

    init(customSearchBar: UISearchBar) {
        searchBar = customSearchBar
        super.init(frame: CGRect.zero)

        addSubview(searchBar)
    }

    override convenience init(frame: CGRect) {
        self.init(customSearchBar: UISearchBar())
        self.frame = frame
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        searchBar.frame = bounds
    }
}

class MyViewController: UIViewController {

    func setupNavigationBar() {
        let searchBar = UISearchBar()
        let searchBarContainer = SearchBarContainerView(customSearchBar: searchBar)
        searchBarContainer.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 44)
        navigationItem.titleView = searchBarContainer
    }
}


답변

viewDidLoad의 “ACKNOWLEDGEMENTS”뷰 컨트롤러에서이 코드를 시도하십시오.

self.extendedLayoutIncludesOpaqueBars = true


답변

다들 감사 해요! 마침내 해결책을 찾았습니다.

UISearchBar를 사용하여 ViewController에 다음 코드를 추가합니다.

  1. 첫 번째 단계: viewDidLoad
-(void)viewDidLoad
{
    [super viewDidLoad];
    self.extendedLayoutIncludesOpaqueBars = YES;
    ...
}
override func viewDidLoad() {
    super.viewDidLoad()
    self.extendedLayoutIncludesOpaqueBars = true
}
  1. 두번째 단계:viewWillDisappear
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
     // force update layout
    [self.navigationController.view setNeedsLayout];
    // to fix height of the navigation bar
    [self.navigationController.view layoutIfNeeded];
}
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        navigationController?.view.setNeedsLayout() // force update layout
        navigationController?.view.layoutIfNeeded() // to fix height of the navigation bar
    }


답변

Objective-C에서

if (@available(iOS 11.0, *)) {
        [self.searchBar.heightAnchor constraintLessThanOrEqualToConstant: 44].active = YES;
}


답변

이것은 나에게도 발생합니다. 모두 iOS 12.4에서 잘 실행되고 위의 13에서 이상해집니다. 문제는 searchBar를 구현하는 UIViewController에서 점프 한 후 iOS 13 탐색 모음 높이가 88에서 100으로 증가하는 것입니다.

searchBar를 구현하는 UIViewController에서 이것을 시도하십시오.

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    navigationController?.view.setNeedsLayout()
    navigationController?.view.layoutIfNeeded()
}

수정 후 미리보기 :

여기에 이미지 설명 입력
여기에 이미지 설명 입력

수정하기 전에 미리보기 :

여기에 이미지 설명 입력
여기에 이미지 설명 입력