ios - 搜索栏在事件时移动

标签 ios objective-c cocoa-touch uisearchcontroller

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

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

我尝试过更改各种 View 的插图,并强制手动更改各种 View 的框架(这是最接近修复的方法,但看起来很老套)。我做错了什么?

编辑:也尝试过:

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

最佳答案

因为您使用UISearchController,所以searchBar在激活时将始终移动。为了避免这种情况,请使用UISearchBar。当您使用UISearchBar时,选择Category选项卡

时很容易隐藏

关于ios - 搜索栏在事件时移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327327/

相关文章:

objective-c - 在App和Cocoa Touch Framework目标中使用静态库

objective-c - 如何替换 NSString 中出现的\xa0 字符

iphone - 在 UIWebView 中从 NSData 加载 UIImage 并将其居中

ios - 有什么方法可以快速压缩视频?

ios - 最近更新后 SwiftUI ForEach 不工作

objective-c - Objective C 协议(protocol)循环依赖?

iphone - 在 1 个单元格内绘制 6 个 ImageView

ios - 这个示例代码让我定义了一些东西,但我还不想定义?

ios - 如何在离线时使用 NSURLCache 返回缓存的 API 响应(iOS App)

iphone - iOS iPhone 5 选择正确的 Storyboard