SearchBar在活动时移动

时间:2017-11-16 10:32:08

标签: ios objective-c cocoa-touch uisearchcontroller

我有一个带有SegmentedControl,UITableView和UISearchController的UIViewController。 SegmentedControl位于主View的顶部,tableView位于其下方。 searchController的searchBar放在tableView.tableHeaderView中,如下所示:

enter image description here

当点击搜索栏(激活)时,它向下移动,留下上面的间隙:

enter image description here

此外,如果searchBar处于活动状态,然后点击segmentedConrol(过滤表数据并重新加载tableView),则tableView会加载,但顶部会有间隙。 (当选择“类别”过滤器时,我故意将searchBar设置为隐藏。

enter image description here

如果在searchBar未激活时选择了segmentedControl“类别”,则它的外观(应该看起来):

enter image description here

我需要两件事(我认为它们是相关的),1)因为searchBar在活动时不移动,2)当选择“类别”时,searchBar不存在,并且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];
}

我已经尝试更改各种视图的插图并强制手动更改各种视图的帧(这是最接近修复但看起来非常h​​acky)。我做错了什么?

编辑:还尝试过:

-(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];
}

1 个答案:

答案 0 :(得分:0)

因为您使用UISearchController所以searchBar会在活动时始终移动。要避免它,请使用UISearchBar。当您使用UISearchBar时,当您选择Category tab

时,它很容易隐藏