UISearchBar 및 UINavigationItem
-
06-07-2019 - |
문제
탐색 모음에서 UISearchBar를 맨 왼쪽에서 맨 오른쪽으로 배치할 수 없는 것 같습니다.-(void)viewDidLoad 메서드에는 다음 코드가 있습니다.
UISearchBar *sb = [[UISearchBar alloc] initWithFrame:self.tableView.tableHeaderView.frame];
sb.delegate = self;
self.navigationItem.titleView = sb;
[sb sizeToFit];
[sb release];
빌드하고 실행해 보면 언뜻 보기에 괜찮아 보입니다.그러나 좀 더 자세히 살펴보면 왼쪽에 여백/공간이 있음을 알 수 있습니다.큰 계획에서는 큰 문제가 아니지만 검색을 시작하기 위해 검색창을 탭하면 취소 버튼이 표시되도록 애니메이션으로 표시됩니다.검색 표시줄이 약간 오른쪽에 위치하기 때문에 애니메이션이 불안정하고 취소 버튼이 다음과 같이 끝에서 떨어집니다.링크 텍스트
UINavigationItem은 세 개의 셀이 있는 테이블과 같습니다. 첫 번째 셀과 마지막 셀에는 제거할 수 없는 패딩이 있습니다. 또한 이를 모두 '병합'한 다음 배치할 수 있는 방법도 없는 것 같습니다. 거기 검색창이요.AppStore 검색에는 탐색 표시줄에 검색 표시줄이 있고 가장자리까지 계속 표시되기 때문에 이러한 모양이 가능하다는 것을 알고 있습니다.슬라이드인 취소 버튼 애니메이션이 제대로 작동하도록 검색창을 가장자리까지 이동시키는 방법을 아는 사람이 있나요?
해결책 3
답을 찾은 것 같습니다. 비록 테스트를 통해 검증하지는 않았지만요.위에서 제공한 문제에는 다음과 같은 구조가 있습니다.
탭바 컨트롤러 -> 네비게이션 컨트롤러 -> 뷰 컨트롤러
문제의 검색 표시줄은 뷰 컨트롤러에 있었고, 이는 다시 탐색 컨트롤러에 있었고, 탐색 컨트롤러는 탭 표시줄에 있었습니다.
스탠포드 CS 193P(2009년 봄학기) 강좌를 무심코 보고 있었는데 13강 말미에 답이 나왔을지도 모르겠습니다.Alan Cannistraro는 Presence 앱의 구조가 다음과 같은 구조를 가져야 한다고 말했습니다.
이 구조는 http://img143.imageshack.us/img143/6/viewcontrollerstructure.jpg
여기서 하단 뷰 컨트롤러(탭 막대 컨트롤러에 인접)는 검색 막대 컨트롤이 있는 뷰 컨트롤러였습니다.그는 이런 방식으로 하지 않으면 "문제에 봉착하게 될 것"이라고 경고했다.아마도 내가 직면한 문제일까요?나는 그렇다고 믿는다.
다른 팁
실제로, 정말 간단한 솔루션이 있습니다. 뒷면 항목에 대한 영점보기를 만듭니다.
UIView *hackView = [[UIView alloc] initWithFrame:CGRectZero];
UIBarButtonItem *hackItem = [[UIBarButtonItem alloc] initWithCustomView:hackView];
self.navigationItem.backBarButtonItem = hackItem;
[hackView release];
[hackItem release];
UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[searchBar sizeToFit];
self.navigationItem.titleView = searchBar;
[searchBar release];
init가 아닌로드 뷰 방법 에서이 작업을 수행하십시오. 왜 그것이 차이를 만드는지 잘 모르겠지만 그렇게합니다.
분명히 그것은 타이밍에 관한 것입니다. Loadview에 그것을 사용하면 나를 위해 작동하지 않았지만 ViewWillAppear 작업에 넣는 것이 좋습니다 (물론 한 번만 수행되도록 확인하여). 아이디어는 일부 초기화가 이미 완료된 후 TitleView를 설정하는 것입니다.
다음 코드는이 UIViewController에 대해서만 NavigationBar를 숨 깁니다.
- (void)viewWillAppear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:YES animated:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[self.navigationController setNavigationBarHidden:NO animated:animated];
}
따라서 uisearchbar가 uinavigationbar의 장소에 표시되도록하려면 루트보기 컨트롤러에 탐색 표시 줄이 정상적으로있는 검색 표시 줄이 있습니다!
어쩌면 애플은 이런 일을하기 위해 uisearchDisplayController를 사용하고있을 것입니다.