iOS 11에서 스크롤하지 않고 탐색 막대에 검색 막대 표시


80

navigationItem.searchControlleriOS 11의 UITableViewController 속성에 UISearchController를 연결하고 있습니다 . 이것은 잘 작동합니다. 멋진 iOS 11 스타일의 검색 창을 사용할 수 있습니다.

그러나 시작시 검색 표시 줄을 표시하고 싶습니다. 기본적으로 사용자는 검색 창을 보려면 테이블보기에서 위로 스크롤해야합니다. 이것이 어떻게 가능한지 아는 사람이 있습니까?

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

왼쪽 : 출시 후 기본 상황. 오른쪽 : 검색 표시 줄이 표시됩니다 (위로 스크롤). 오른쪽 스크린 샷과 같이 시작 후 검색 표시 줄을 표시하고 싶습니다.

hidesSearchBarWhenScrolling내 탐색 항목 의 속성 을 false 로 설정하여 검색 창을 표시 할 수 있음을 이미 발견했습니다 . 그러나 이렇게하면 아래로 스크롤해도 검색 표시 줄이 항상 표시됩니다. 이것은 제가 원하는 것이 아닙니다.


당신이 코드를 추가 곳에서hidesSearchBarWhenScrolling
Anbu.Karthik

1
s로 설정하는 것은 firstResponder어떻습니까?
Milan Nosáľ

2
아래에서 선택한 답변은로드시 저에게 효과적이지만 scrollView.setContentOffset(_:animated). 누구든지 제안이 있습니까?
Justin Vallely

@Jonathan hidesSearchBarWhenScrolling = false은 iOS 13의 큰 제목 위에 검색 창을 표시합니다. 어떻게 든 업데이트 할 수 있는지 알 수 있나요?
Bonnke 19

답변:


187

다음은 검색 창을 처음에 표시 한 다음 스크롤 할 때 숨길 수 있도록합니다.

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = false
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    if #available(iOS 11.0, *) {
        navigationItem.hidesSearchBarWhenScrolling = true
    }
}

를 사용하면 isActive내가 원하는 작업을 수행하지 않고 검색 창을 활성화 (취소 버튼 표시 등) 할 수 있습니다.


고마워, 나를 위해 일했다. 그래도 흥미로운 솔루션 :)
Mikrasya

9
이 솔루션은 작동하지만 이전에 숨긴 경우 탐색 모음도 표시하는 경우 부작용이 있습니다 (예 : 탐색 모음이있는이보기를 탐색 스택에 밀어 넣음) 탐색 모음이 애니메이션 될 때 검색 모음이 정적으로 표시됩니다. 끔찍한 :( 보이는
마태 복음 크렌쇼

12
당신의 첫 번째 부분을 넣어하지 않을 경우 viewDidLoad대신viewWillAppear
마크 - 알렉상드르 Bérubé

1
누군가 이것이 왜 작동하는지 그리고 왜 searchController.searchBar.isHidden = falseviewDidLoad에서 작동 하지 않는지 에 대해 자세히 설명해 주시겠습니까? 후자는 나에게 훨씬 더 논리적 보인다
pho_pho

5
이로 인해 자식 화면에서 돌아갈 때 iOS 13에서 시각적 버그가 발생합니다.
nemissm

5

에 searchController를 추가 한 후 속성 isActive을로 설정할 수 있습니다 .truenavigationItem

다음과 같이 :

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    searchController.isActive = true
}

Setter 메서드 'setIsActive :'없음
Nikolay Krasnov

맞아요, @NikolayKrasnov. isActive읽기 전용 부울입니다. 대신를 사용하는 searchController.active = true것이 좋습니다.
Mark Jeschke

2

나를 위해 viewDidLoad()방법에 다음 줄을 추가 한 후에 작동했습니다 .

navigationController?.navigationBar.prefersLargeTitles = true
navigationController!.navigationBar.sizeToFit()

0

iOS 13에서는 @Jordan Wood의 답변이 작동하지 않았습니다. 대신 나는했다 :

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    UIView.performWithoutAnimation {
        searchController.isActive = true
        searchController.isActive = false
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.