2017-11-16 11 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]; 
} 

私は(これが最も近いものであるさまざまなビューのインセットを変更し、さまざまなビューのフレームを手動で変更を強制的に試してみました修正するが、非常にハッキーに見える)。私は間違って何をしていますか?

編集:も試してみました:

-(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

私は単にsearchBarを隠したり移動したりしました。 _searchController/searchBar(ビューとして)を完全に削除し、セグメント化されたコントロールが再び(メインフィルタに対して)タップされたときに再構築することを意味しますか? – Ryan

+0

私は '' {_searchController dismissViewControllerAnimated:NO completion:^ {}}; 'を意味し、コンプリートブロックでセグメント2に変更することができます – trungduc

答えて

0

あなたがUISearchControllerを使用するので、それは活性物質ときにsearchBarは常に移動します。それを避けるには、UISearchBarを使用してください。 UISearchBarを使用すると、選択したときに非表示にするのは簡単ですCategory tab

+0

私はUISearchControllerの使用をやめ、代わりにUISearchBarを使用しました。 – Ryan

関連する問題