2014-12-29 2 views
4

검색 막대를 얻으려고하고 탐색 막대에 범위가 표시됩니다 (보기가 처음 나타나는 방식). UISearchBar를 인터페이스 빌더의 테이블 뷰 컨트롤러로 드래그하면 헤더 셀처럼 테이블에 배치됩니다. 그런 다음 탭을하면 아래에있는 형식으로 움직입니다.iOS : 탐색 막대에 검색 막대가 표시되면 숨겨진 범위 막대

enter image description here 그래서

이, 도청없이 검색 창을 즉시 포커스를하기 : 문제는 내가 왼쪽에 백 버튼으로, 어떤 도청없이이 방법을 시작하고 더 오른쪽에있는 버튼을 취소 할 없습니다 , 나는 작동하지 않는 viewDidLoad에 [_searchBar becomeFirstResponder];을 추가하려고 시도했다. 다음으로 시도 :

self.searchDisplayController.displaysSearchBarInNavigationBar = YES; 

검색 창은 실제로 탐색 모음에 표시되지만 범위 표시 줄이 사라, (APPLE 왜 왜)과는 어색한 차이가있다.

enter image description here

는 또한 UINavigationBar의 서브 클래스하고 키가 만드는 시도했습니다. 크기는 쉽게 변경할 수 있지만 내용은 막대의 아래쪽에 정렬되며 추가하려는 항목이 겹쳐집니다.

다시 반복하려면 사용자가 아무런 두드림없이보기가 처음 나타날 때 탐색 막대에 범위 컨트롤이 표시되도록 검색 표시 줄이 필요합니다. 또한 UITableViewController (페이지에 UIRefreshConrol이 있기 때문에)를 지정해야하므로 단순히 테이블 뷰 위에 도구 모음을 놓는 것이 옵션이 아닙니다. 감사.

답변

4

tl; dr :하지 마십시오. 당신은 UITableViewheaderViewUISearchBar를 추가하는 것은 시작에 범위 표시 줄을 숨기기 용이 UIKit 내에서 일부 사용자 지정 코드를 호출하는 것을 알아야한다

. iOS 6 이상에서는 스코프 바를 항상 쉽게 표시 할 수 있었지만 iOS 7에서는이를 변경했습니다.

becomeFirstResponder에서 viewDidLoad으로의 첫 번째 방법은 좋았지 만보기가 메모리로로드 된 후 (NIB 외부에서)이 메서드가 호출됩니다. 뷰가 뷰 계층 구조에 아직 추가되지 않았으므로 첫 번째 응답자가 될 수 없습니다. viewDidAppear:은 뷰가 뷰 계층 구조로로드 된 후 오른쪽 이라고하고 becomeFirstResponder은 실제로 UISearchBar에서 포커스를받을 수 있습니다.

범위 표시 줄 자체는 숨김 (기본적으로) 하위보기 UISearchBar입니다. 기술적으로 하위 뷰를 순환하고 숨기지 않도록 설정할 수 있습니다.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self recurseSubviewsForView:self.searchDisplayController.searchBar]; 
} 

- (void)recurseSubviewsForView:(UIView *)view 
{ 
    for (UIView *subview in view.subviews) { 
     if ((CGRectGetMinY(subview.frame) == CGRectGetMaxY(self.searchDisplayController.searchBar.frame)) && subview.hidden) { 
      subview.hidden = NO; 
      self.searchDisplayController.searchBar.showsScopeBar = YES; 
      [self.searchDisplayController.searchBar sizeToFit]; 
     } 
     [self recurseSubviewsForView:subview]; 
    } 
} 

이것은 일반적으로 좋지 않습니다. 대상이되는 하위 뷰가 범위 막대를 포함하는 하위보기라는 것을 확인하는 기본 검사가 있습니다. 그러나 잠시 중단 될 수 있으며 하위 호환성이 없을 수 있습니다.

진짜 질문은 입니다. 스코프 바를 항상 보이게하고 싶습니까? 현재 작동하는 방식으로 사용자가 검색 필드를 탭하면 검색 막대가 더 이상 포커스를 갖지 않을 때 스코프 바가 표시됩니다. 위의 "해킹"이 있더라도 사용자가 범위 단추를 누르 자마자 검색 막대가 포커스를 얻습니다.검색이 활성화되지 않은 경우 검색 옵션을 표시하는 요점은 무엇입니까? 의심스러운 점이 있다면 은 Apple의 제안으로 돌아갑니다. 그것은 장기적으로 당신의 인생을 훨씬 쉽게 만들어 줄 것이며, 아마 당신의 앱을 보이게하고 더 잘 행동하게 만들 것입니다. 애플은 그 상호 작용을 변덕에 덧붙이 지 않았다. 그들은 미친 듯이 그것을 테스트했습니다. 그것이 다른 방식으로 작동하게하는 것이 그렇게 어려운 이유입니다. 그렇기 때문에 UISearchBar이 인 UITableView 일 때 특수 코드가 실행되는 이유는 사용자에게 더 좋을 수 있기 때문입니다.

또한 iOS 8을 타겟팅하는 스크린 샷을 보았지만 코드는 UISearchDisplayController을 사용하여 코드를 잘라 냈습니다. 이 패러다임은 더 이상 사용되지 않으므로 UISearchController을 사용합니다. 업데이트를 고려하십시오.

+0

'viewDidAppear :'에'becomeFirstResponder'를 넣지 않았다고 좌절감을 느꼈습니다. 감사! 귀하의 질문에 대답하기 위해 : 나는 VC가 항상 검색을 위해 항상 보이도록 원한다. (Instagram의 검색 탭을 보아라. 이것은 내가 한 것이다.) 또한, 'UISearchDisplayController'를 사용하는 매우 좋은 이유가있다 - iOS7과의 호환성. iOS8에서는 더 이상 사용되지 않지만 완전히 유효합니다 (여전히 IB의 객체 라이브러리에 있음). 남은 질문 : 네비게이션 바에 검색 창을 표시하는 옵션을 사용하면 왜'showsScope = YES' 설정에 관계없이 범위를 숨길 수 있습니까? – inorganik

+1

왜 스코프 바를 숨 깁니까? 나도 몰라, [문서화되어있다] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchDisplayController_Class/index.html#//apple_ref/occ/instp/UISearchDisplayController/displaysSearchBarInNavigationBar). * "탐색 막대에 표시되는 검색 막대에서'showsScopeBar' 속성을'YES'로 설정하면 시스템에서 예외가 발생합니다."* 탐색 막대 높이가 범위 막대를 표시 할만큼 충분히 높지 않기 때문일 수 있습니다. – greg

관련 문제