programing

UISearchController가 활성화되면 iOS 9 searchBar가 테이블 헤더보기에서 사라집니다.

goodcopy 2021. 1. 16. 10:38
반응형

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 8의 검색 창

iOS 9에서 활성화 된 UISearchController :iOS 9의 검색 창

매우 표준적인 코드 :

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

반응형