2014-09-29 3 views
2

Segmented Control 및 UITableView가있는 UIViewController가 있습니다. 모두 스토리 보드에 설정된 Autolayout을 사용합니다. 나는 테이블의 헤더보기로 UISearchController 및 UISearchbar을 추가 한UISearchController가 검색 결과 테이블을 표시하도록 강요합니다. 전체 화면

H:|-[SegmentedControls]-| 
H:|[TableView]| 
V:|-[SegmentedControls]-[TableView]| 

: 여기가 설정 제약의 코드 버전입니다. 검색 결과를 표시하기 위해 새로운 UITableViewController를 만듭니다.

UITableViewController *searchResultsController = [[UITableViewController alloc] initWithStyle:UITableViewStylePlain]; 
searchResultsController.tableView.dataSource = self; 
searchResultsController.tableView.delegate = self; 

self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsController]; 
self.searchController.delegate = self; 
self.searchController.searchResultsUpdater = self; 
self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, self.searchController.searchBar.frame.origin.y, self.searchController.searchBar.frame.size.width, 44.0); 
self.clientListTable.tableHeaderView = self.searchController.searchBar; 
self.searchController.searchBar.scopeButtonTitles = @[@"Active", @"Inactive"]; 
self.definesPresentationContext = YES; 

그러나 나는 다음과 같은 문제에 걸쳐 온 - 난 검색 창에 눌러,이 애니메이션을하지만, 제시된보기는 대신, 상단과 하단에 흐리게 크롬되게 화면의 일부를 선택할 경우, 전체 화면으로 표시됩니다. 제시된보기의 크기는 검색 막대를 호스팅하는 tableview 중 하나와 같으며 화면의 세로 가운데에 위치합니다. 검색 결과의 표시 방식을 재정의하여 전체 화면으로 전환하는 방법이 무엇인지 모릅니다. 명시 적으로 ModalPresentationStyle을 표시 컨트롤러에 표시하고 표시 컨트롤러 모두에 설정하려고했지만 작동하지 않았습니다. 필자는 검색 결과의 프리젠 테이션 컨트롤러를 어떻게 든 재정의해야 할 필요가 있다고 느끼지만, 어디서부터 시작해야할지 모르겠다.

+0

Apple의 UICatalog 샘플 코드를 살펴 보셨습니까? https://developer.apple.com/library/ios/samplecode/UICatalog/Introduction/Intro.html –

+0

그건 내가 한 첫번째 일 중 하나 였고, 다음은 Apple 개발자 포럼 및 Apple 개발자 지원에 대한 질문이었습니다. –

답변

0

해결 방법 (UISearchController없이 UISearchBar의 입력을 수동으로 관리)을 사용한 지 약 1 년이 지난 후에 해결책을 찾았습니다. SearchController는 호출 된 테이블과 동일한 크기로 설정된 새 테이블에 결과가있는 테이블을 제공합니다. 그래서 내 테이블은 뷰의 일부 였기 때문에 제시된 테이블도 풀 스크린이 아니 었습니다. 내가 실수 한 것은 Segmented Controls를 숨기려고했으나 제약 조건을 업데이트하지 않았다는 것입니다 (당시에는 자동 레이아웃이 좋지 않음). 그래서 "자동 레이아웃의 신비"에 올해 WWDC의 발표를보고 난 후에 내가 해결책을했다 :

-(void)willPresentSearchController:(UISearchController *)searchController { 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [NSLayoutConstraint deactivateConstraints:@[_constraintToTheSegmentalControls,_constraintToTheTop]]; 
        [NSLayoutConstraint activateConstraints:@[_constraintToTheTop]]; 
        self.segmentedControls.hidden = YES; 
       } 
       completion:NULL]; 
} 

    -(void)didDismissSearchController:(UISearchController *)searchController { 

[UIView animateWithDuration:0.5 
         delay:0.0 
        options: UIViewAnimationOptionCurveEaseInOut 
       animations:^(void) { 
        [NSLayoutConstraint deactivateConstraints:@[_constraintToTheSegmentalControls,_constraintToTheTop]]; 
        [NSLayoutConstraint activateConstraints:@[_constraintToTheSegmentalControls]]; 
        self.segmentedControls.hidden = NO; 
       } 
       completion:NULL]; 
} 

제약 "constraintToTheSegmentalControls는"로, 세그먼트 컨트롤의 바닥에 테이블 뷰의 상단에서 제약 조건입니다 기본값은 활성입니다. 제약 조건 "constraintToTheTop"은 테이블 뷰의 맨 위에서 맨 위 레이아웃 가이드까지의 제약 조건이며 기본적으로 비활성화되어 있습니다. 둘 모두를 내 View Controller에 대한 IB 참조로 추가했습니다.

애니메이션은 여전히 ​​약간의 조정이 필요하지만 해결책이 효과적입니다.