2017-11-16 5 views
0

SegmentedControl, UITableView 및 UISearchController가있는 UIViewController가 있습니다. SegmentedControl은 tableView 바로 아래에있는 기본 뷰의 맨 위에 있습니다. searchController의 검색 창은이 같은 tableView.tableHeaderView에 놓고 본다된다활성 상태 일 때 SearchBar가 이동합니다.

검색 창은 (활성 제) 도청

enter image description here

그냥 위의 격차를 떠나 아래로 이동 :

enter image description here

또한 searchBar가 활성화되어 있고 segmentedConrol이 탭되면 (테이블 데이터를 필터링하고 tableView를 다시로드하는 경우) tableView가로드되지만 맨 위에는 간격이 있습니다. (나는 일부러 '카테고리'필터를 선택하면 숨겨진에 검색 창을 설정했습니다.

enter image description here

을 segmentedControl '카테고리는'검색 창은이 보이는 어떻게 활성화되지 않은 경우 선택 (봐해야하는 경우) :

enter image description here

내가 두 가지 (나는 그들이 관련되어 생각), 액티브 1) 검색 창 이동하지하는과 '분류'를 할 때 2) 검색 창은 존재하지 할 필요가 선택된다 tableView 맨 위에 간격이 있어야합니다.

.H :

@interface ExhibitorViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating> 
{ 
    // DATA 
    NSMutableArray *arrayOfExhibitors; 
    NSMutableArray *arrayOfExhibitorsFiltered; 
    NSMutableArray *arrayOfCategories; 
    NSMutableArray *arrayOfCategoriesFiltered; 

    // VARS 
    int selectedSegment; 
    float searchBarHeight; 
    float tableViewY; 
    NSString *currentCategory; 
    CGRect tableViewStartRect; 

    // UI 
    UISegmentedControl *segmentedControl; 
    UIView *categorySelectedView; 
    UIView *headerView; 

} 

@property (nonatomic, strong) UITableView *tableView; 
@property (nonatomic, strong) UISearchController *searchController; 
@property (nonatomic, readonly) NSArray *searchResults; 
@property (strong, nonatomic) NSString *sponsorsOnly; 

@end 

하는 .m :

-(void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self.navigationController setNavigationBarHidden:NO animated:NO]; 
    if (selectedSegment == 0) { 
     self.searchController.searchBar.hidden = FALSE; 
    } 
    if (!_searchController.searchBar.superview) { 
     self.tableView.tableHeaderView = self.searchController.searchBar; 
    } 
} 

-(void)loadTableView 
{ 
    [self printStats:@"loadTableView START"]; 
    searchBarHeight = self.searchController.searchBar.frame.size.height; 
    Settings *settingsInstance = [Settings new]; 

    if(!_tableView) {   
     segmentedControl = [UISegmentedControl new]; 
     segmentedControl = [[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"Exhibitor", @"Category", nil]]; 
     [segmentedControl setFrame:CGRectMake(0, 0, self.view.frame.size.width, 35)]; 
     segmentedControl.selectedSegmentIndex = 0; 
     [segmentedControl addTarget:self action:@selector(segmentedControlHasChangedValue) forControlEvents:UIControlEventValueChanged]; 

     self.automaticallyAdjustsScrollViewInsets = YES; 
     self.edgesForExtendedLayout = UIRectEdgeNone; 
     self.searchController.hidesNavigationBarDuringPresentation = NO; 
     //self.definesPresentationContext = NO; 

     float tvX = self.view.frame.origin.x; 
     float tvY = self.view.frame.origin.y + segmentedControl.frame.size.height; 
     float tvWidth = self.view.frame.size.width; 
     float frameHeight = self.view.frame.size.height; 
     float tvHeight = self.view.frame.size.height - segmentedControl.frame.size.height; 
     tableViewStartRect = CGRectMake(tvX, tvY, tvWidth, tvHeight); 

     _tableView = [UITableView new]; 
     _tableView = [[UITableView alloc]  initWithFrame:tableViewStartRect]; 
     //_tableView.contentInset = UIEdgeInsetsMake(0, 0, 44, 0); 
     _tableView.separatorColor = [UIColor clearColor]; 
     _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

     [self.view addSubview:segmentedControl]; 
     [self.view addSubview:_tableView]; 
     [_tableView setTag:1]; 
     [_tableView setDataSource:self]; 
     [_tableView setDelegate:self]; 
    } 

    if (!categorySelectedView) { 
     float levelOneStart = (0); 
     categorySelectedView = [[UIView alloc] initWithFrame:CGRectMake(0, levelOneStart, self.view.frame.size.width, (screenHeight * 0.05))]; 
     [categorySelectedView setBackgroundColor:[UIColor grayColor]]; 
     [categorySelectedView setTag:4]; 
     MyLabel *catSelectedLabel = [[MyLabel alloc]  initWithFrame:categorySelectedView.frame]; 
     [catSelectedLabel setFont:[UIFont systemFontOfSize:[settingsInstance getFontSizeFor:@"Label"]]]; 
     [catSelectedLabel setTag:5]; 
     [catSelectedLabel setBackgroundColor:[UIColor lightTextColor]]; 
     [catSelectedLabel setTextColor:[UIColor darkGrayColor]]; 
     UIButton *categoryBackButton = [[UIButton alloc] initWithFrame:CGRectMake((screenWidth * 0.6), levelOneStart, (screenWidth * 0.4), (screenHeight * 0.05))]; 
     [categoryBackButton setTitle:@"^ Back ^" forState:UIControlStateNormal]; 
     [categoryBackButton setTitleColor:[UIColor darkGrayColor] forState:UIControlStateNormal]; 
     [categoryBackButton addTarget:self action:@selector(resetTableViewCategories) forControlEvents:UIControlEventTouchUpInside]; 
     [catSelectedLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(resetTableViewCategories)]]; 
     [categoryBackButton.titleLabel setFont:[UIFont systemFontOfSize:[settingsInstance getFontSizeFor:@"Label"]]]; 
     [categorySelectedView addSubview:catSelectedLabel]; 
     [categorySelectedView addSubview:categoryBackButton]; 
     [categorySelectedView setHidden:TRUE]; 
    } 

    if (!headerView) { 
     headerView = [[UIView alloc] initWithFrame:CGRectMake(0, (0), screenWidth, (searchBarHeight))]; 
     [headerView addSubview:categorySelectedView]; 
     [self.view addSubview:headerView]; 
     [headerView setBackgroundColor:[UIColor purpleColor]]; 
     [self.view sendSubviewToBack:headerView]; 
    } 

    [self.view setTag:11]; 

    tableViewY = _tableView.frame.origin.y; 
    [self printStats:@"loadTableView END"]; 
} 

-(UISearchController*)searchController 
{ 
    if (!_searchController) { 
     _searchController = [[UISearchController alloc]initWithSearchResultsController:nil]; 
     _searchController.searchResultsUpdater = self; 
     _searchController.dimsBackgroundDuringPresentation = NO; 
     _searchController.searchBar.delegate = self; 
     [_searchController.searchBar sizeToFit]; 
    } 

    return _searchController; 
} 

-(void)segmentedControlHasChangedValue 
{ 
    [self.searchController setActive:NO]; 
    if ((segmentedControl.selectedSegmentIndex == 0)) { 
     selectedSegment = 0; 
     currentCategory = @""; 
     [self resetTableViewExhibitors]; 
     [_tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
    } else { 
     selectedSegment = 1; 
     [self resetTableViewCategories]; 
     [_tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
     //[_tableView setContentOffset:CGPointMake(0, 56) animated:NO]; 
     [_tableView setTableFooterView:nil]; 
    } 

    [_tableView reloadData]; 
} 

I (이 가장 가까운 것입니다 다양한 뷰의 인 세트의 값을 변경하고 다양한 뷰의 프레임에 수동으로 변경 강요 시도 수정하지만 매우 해커처럼 보입니다). 내가 도대체 ​​뭘 잘못하고있는 겁니까? 편집

은 :도 시도 해 봤나 :

-(void)segmentedControlHasChangedValue 
{ 
    [self.searchController setActive:NO]; 
    if ((segmentedControl.selectedSegmentIndex == 0)) { 
     selectedSegment = 0; 
     currentCategory = @""; 
     [self resetTableViewExhibitors]; 
     [_tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
    } else { 
     selectedSegment = 1; 
     [_searchController dismissViewControllerAnimated:NO completion^() { 
      [self resetTableViewCategories]; 
      [_tableView setContentOffset:CGPointMake(0, -1) animated:NO]; 
      [_tableView setTableFooterView:nil]; 
     }]; 
    } 
    [_tableView reloadData]; 
} 
+0

세그먼트를 탭하면 '_searchController'를 닫으려고 했습니까?'_searchController.searchBar'를 선택 취소 했습니까? – trungduc

+0

간단히 검색 막대를 숨기거나 이동했습니다. _searchController/searchBar (보기)를 모두 제거한 다음 세그먼트 화 된 컨트롤을 다시 (기본 필터로) 두드리면 다시 작성한다는 의미입니까? – Ryan

+0

나는 [[_searchController dismissViewControllerAnimated : 완료 :^{}];을 의미하고 완료 블록에서 세그먼트 2로 변경할 수 있습니다. – trungduc

답변

0

당신이 활성 때 너무 searchBar 항상 이동합니다 UISearchController을 사용하기 때문에. 이를 피하려면 UISearchBar을 사용하십시오. UISearchBar을 사용하면 선택시 숨기기가 쉽습니다. Category tab

+0

UISearchController 사용을 중단하고 대신 UISearchBar를 사용하면 모든 것이 이제는 정상적으로 작동합니다. – Ryan