UISearchBar动画问题

问题描述 投票:19回答:8

我有一个UIViewController,我想在其中显示一个带有搜索栏的tableview。就如此容易:

//viewDidLoad
_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,
                                                           0, 
                                                           SCREEN_WIDTH(),
                                                           SCREEN_HEIGHT())
                                                    style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;

[self.view addSubview:_tableView];

// adding uisearch bar
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

_tableView.tableHeaderView = searchBar;



//
 searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;

当我在uisearch栏内单击以便动画开始并且看起来它具有20px不需要的偏移时,就会出现问题

uitableview ios7 uisearchbar uisearchdisplaycontroller
8个回答
15
投票

在Storyboard中,选择有问题的控制器,查看“属性”选项卡并尝试编辑这些设置:

  • 在顶部酒吧
  • 在不透明的酒吧

我通过解开这些设置解决了类似的问题。


8
投票

我找到了导致这个问题的原因。当您将navigationBar.translucent设置为NO时,似乎动画会搞乱。如果你使navigationBar半透明,一切都应该工作正常,但这绝对不是一个理想的解决方案。我打算尝试找一个解决方法。


1
投票
UITableView *_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0,
                                                           64,
                                                           self.view.frame.size.width,
                                                           self.view.frame.size.height)
                                          style:UITableViewStylePlain];
_tableView.delegate = self;
_tableView.dataSource = self;

[self.view addSubview:_tableView];

// adding uisearch bar
UISearchBar* searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

_tableView.tableHeaderView = searchBar;



//
UISearchDisplayController* searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;

我只是用UINavigationcontroller来控制我的控制器,它的工作得很好..


1
投票

您可以通过继承UISearchDisplayController并添加以下内容来取消动画:

- (void)setActive:(BOOL)visible animated:(BOOL)animated
{
     if(self.active == visible) return;
     [self.searchContentsController.navigationController setNavigationBarHidden:YES animated:NO];
     [super setActive:visible animated:animated];
     [self.searchContentsController.navigationController setNavigationBarHidden:NO animated:NO];
     if (visible) {
          [self.searchBar becomeFirstResponder];
     } else {
          [self.searchBar resignFirstResponder];
     }
}

1
投票

codyko给了我一个主意。这是因为导航栏没有半透明。所以我把它设置为半透明的这个视图控制器,当我离开时使用以下代码休息:

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.navigationController.navigationBar.translucent = NO;
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    self.navigationController.navigationBar.translucent = YES;
}

现在,这个控制器上的导航栏略微褪色,所以我添加了一个与我后面的导航栏颜色相同的UIView,使其看起来不透明。我知道它并不完美,但效果很好。


1
投票

提醒任何有类似问题的人。我需要添加固定内容的这一行:

self.edgesForExtendedLayout = UIRectEdgeNone;

0
投票

为什么要以编程方式而不是在StoryBoard中创建搜索栏?我目前正在使用搜索栏,在故事板中添加它并且工作正常(我必须更改contentOffset)


-2
投票

我已经应用了你的代码,它对我来说很好用,只需隐藏你的导航栏并从y = 20开始搜索栏,而不是y = 0;

© www.soinside.com 2019 - 2024. All rights reserved.