UISearchController가 활성화되면 iOS 9 searchBar가 테이블 헤더보기에서 사라집니다.
구조 :
View1 (버튼 클릭)-> 모달로 표시 (MyModalView : UITableViewController)
MyModalView에는 UISearchController가 포함되어 있습니다. UISearchController의 searchBar는 MyModalView.tableView.tableHeaderView에 위치합니다.
iOS 8.0 이후로 잘 작동하고 있습니다. 그러나 iOS 9에서는 UISearchController가 활성화되면 searchBar가 사라집니다. 아래의 논문 사진을보세요
iOS 8에서 활성화 된 UISearchController :
iOS 9에서 활성화 된 UISearchController :
매우 표준적인 코드 :
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
이 문제는 iOS 9.1 베타에서도 발생합니다.
어떤 아이디어 / 포인터라도 깊이 감사하겠습니다.
건배.
문제가 정확히 무엇인지 확실하지 않지만 다음과 같이 '수정'했습니다.
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.definesPresentationContext = NO;
내 생각 엔 UISearchController
그것이 내비게이션 바로 제시하려고 할 때 뭔가 펑키 한 일을하고 있다는 것입니다. 따라서 이것은 해킹이지만 적어도 사용자를 차단하지는 않습니다. 검색 표시 줄은 멋진 애니메이션을 수행하지 않고 탐색 표시 줄을 가리고 있습니다.
우리 모두 같은 문제가있는 것 같지만 다른 방법으로 해결되었습니다. 그러나 제안 된 답변 중 어느 것도 나를 위해 일하지 않았습니다 :(. 그럼에도 불구하고 시간 내 주셔서 감사합니다.
내 문제를 해결 한 해결책이 있습니다. Interface Builder를 사용하여 Storyboard에서 Extend Edges-Under Opaque Bars of my (MyModalView : UITableViewController)를 true로 설정합니다.
요약하자면:
MyModalView : 인터페이스 빌더를 사용하는 스토리 보드의 UITableViewController에는
가장자리 확장 :-체크 된 상단 바 아래-체크 된 하단 바 아래-선택된 불투명 바 아래
이 문제를 일으키는 것은 스토리 보드의 시뮬레이션 된 메트릭 (상단 표시 줄)이라는 것을 알았습니다. 제 경우에는 다음 줄이 작동하지만 여전히 이유를 모르겠습니다.
- (void)willPresentSearchController:(UISearchController *)searchController {
// do something before the search controller is presented
self.navigationController.navigationBar.translucent = YES;
}
-(void)willDismissSearchController:(UISearchController *)searchController
{
self.navigationController.navigationBar.translucent = NO;
}
나는해야했다
self.aNavigationController?.extendedLayoutIncludesOpaqueBars = true
여기 에서 비슷한 질문을 찾았 지만 제 경우에는 viewDidLoad 메서드에 없었습니다. 나는 그것이 효과가있을 때까지 다른 관점을 시도해야했다. 이제 사용자 지정 탐색 모음 색상과 검색 창을 모두 가질 수 있습니다.
감사합니다 @wiles duan 및 @Techprimate
제 경우에는 다음을 설정하여이 문제를 해결했습니다.
self.definesPresentationContext = NO;
그리고 UISearchControllerDelegate에서 다음 두 가지 메소드를 구현하십시오.
- (void)willPresentSearchController:(UISearchController *)searchController {
// do something before the search controller is presented
self.navigationController.navigationBar.translucent = YES;
}
-(void)willDismissSearchController:(UISearchController *)searchController
{
self.navigationController.navigationBar.translucent = NO;
}
내 케이스에서 제거하여 수정했습니다.
definesPresentationContext = true
이것을 제거하는 데 어떤 단점이 있는지 아직 테스트하지 않았습니다!
이 앱 위치에는 탐색 모음이 없습니다. 다른 SO 게시물이 도움이되지 않았으므로 다음과 같이 수정했습니다.
- (void)layoutSubviews
{
[[[self searchController] searchBar] sizeToFit];
}
I had the same problem, and when I debugged the UI on Xcode I found that the UISearchBar
view was moved to another view and the width was zeroed.
I fixed it by setting definesPresentationContext
property of the UISearchController
to false
, and setting it true
for the containing UITableViewController
.
I added only one line to your viewDidLoad()
.
override func viewDidLoad() {
super.viewDidLoad()
// Dynamically create a search controller using anonymous function
self.resultSearchController = ({
let controller = UISearchController(searchResultsController: nil)
controller.searchResultsUpdater = self
controller.dimsBackgroundDuringPresentation = false
controller.definesPresentationContext = false // Disable the presentation controller
controller.searchBar.sizeToFit()
controller.searchBar.delegate = self
self.tableView.tableHeaderView = controller.searchBar
return controller
})()
// Auto sizing row & cell height
self.tableView.estimatedRowHeight = 130
self.tableView.rowHeight = UITableViewAutomaticDimension
self.definesPresentationContext = true // This one remains the same
// No footer for better presentation
self.tableView.tableFooterView = UIView.init(frame: CGRectZero)
}
Setting the navigationBar permanently to translucent in storyboard solved my problem.
It works
override func viewDidLoad() {
super.viewDidLoad()
self.extendedLayoutIncludesOpaqueBars = !self.navigationController!.navigationBar.translucent
}
If you want to hide you navigation bar, and present search controller full screen, set the following on your navigation bar and search bar won't dissapper:
navigationController?.navigationBar.translucent = true
sc.hidesNavigationBarDuringPresentation = false
does the trick for me
lazy var searchController:UISearchController = {
let sc = UISearchController(searchResultsController: nil)
sc.searchResultsUpdater = self
sc.obscuresBackgroundDuringPresentation = false
sc.searchBar.placeholder = "Search"
sc.hidesNavigationBarDuringPresentation = false
return sc
}()
None of them worked for me, I fixed it using this hack
func position(for bar: UIBarPositioning) -> UIBarPosition {
if UIDevice.current.userInterfaceIdiom == .pad {
return .top
} else {
if iOSVersion <= 9 {
return .top
}
return .topAttached
}
}
ReferenceURL : https://stackoverflow.com/questions/32687240/ios-9-searchbar-disappears-from-table-header-view-when-uisearchcontroller-is-act
'programing' 카테고리의 다른 글
Xamarin.Forms ListView : 탭한 항목의 강조 색 설정 (0) | 2021.01.16 |
---|---|
OSX 10.10 Yosemite에 Nokogiri 설치 (0) | 2021.01.16 |
보기에 Android 스케일 애니메이션 (0) | 2021.01.16 |
Android-애니메이션을 사용하여 왼쪽 여백 변경 (0) | 2021.01.16 |
배열을 이동하는 C # 가장 빠른 방법 (0) | 2021.01.16 |