为什么我的UISearchBar的框架被UISearchDisplayController更改

时间:2012-10-16 03:47:39

标签: ios uisearchbar uisearchdisplaycontroller uisearchbardelegate uisearchbardisplaycontrol

我在我的TopBar.m中写了UISearchBar:

_tempSearchBar =[[UISearchBar alloc]initWithFrame:CGRectMake(44, 0, 320 - 44, 43)];
_tempSearchBar.barStyle=UIBarStyleDefault;
_tempSearchBar.placeholder=@"搜索";
[self addSubview:_tempSearchBar];

结果是这样,是对的。 enter image description here

然后我在另一个类中编写UISearchDisplayController:

_topBar.tempSearchBar.delegate = self;    
_searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:_topBar.tempSearchBar contentsController:self];
[_searchDisplayController setDelegate:self];
[_searchDisplayController setSearchResultsDataSource:self];

UISearchBarDelegate是这样的:

#pragma mark -
#pragma mark UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    [_searchDisplayController setActive:YES animated:YES];
}

当我点击UISearchBar时,它显示如下,searchBar的框架被更改了。为什么? enter image description here

当我取消UISearchDisplayController时,它是这样的: enter image description here

框架改变的原因? UISearchDisplayController的宽度从320-44变为320? 感谢。

4 个答案:

答案 0 :(得分:12)

UISearchDisplayController将搜索栏扩展为其超级视图的宽度。我找到的最简单的解决方案是将搜索栏放在另一个具有我正在寻找的宽度的UIView中。

答案 1 :(得分:5)

搜索栏的框架由UIKit更改,所以我自己更改了searchBar的框架。

我在下面的委托中更改了searchBar的框架。

一个是UISearchBar的代表:

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    [searchBar setFrame:CGRectMake(44, 0, 320 - 44, 43)];
}

另一个是UISearchDisplayController的委托:

- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller{
    [controller.searchBar setFrame:CGRectMake(44, 0, 320 - 44, 43)];
    [self.searchDisplayController.searchResultsTableView setDelegate:self];
}

它可以工作,我可以得到正确的框架,但是当我点击searchBar时它会摇晃一下。

这不是最好的方法,但它可以工作。有没有人有更好的方法?

更新: 我已经调试了UISearchBar和UISearchDisplayController几个小时,但它有一个小错误:当我endEditing时,searchBar的宽度将变为320px,然后将成为我的宽度。我无法更改cancelButton的背景颜色。所以我写了一个自定义的SearchDisplayController,它带有一个UISearchBar属性和一个UITableView属性。它适用于我。

答案 2 :(得分:0)

调用委托方法

- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller
{
    [controller.searchBar setFrame:CGRectMake(0,31, 320 , 43)];
    [self.searchDisplayController.searchResultsTableView setDelegate:self];
} 

答案 3 :(得分:-1)

你可以使用 - (void)setShowsCancelButton:animated:来处理searchBar的取消按钮 如果你不想显示取消按钮(因为取消按钮会改变searchBar的框架) 只需在委托中写下

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{   

    [searchBar setShowsCancelButton:NO animated:YES];
}

更新:

唯一可能的解决方案似乎是从SearchBar视图层次结构中找到取消按钮并隐藏它。

for (UIView *possibleButton in searchBar.subviews)
{
    if ([possibleButton isKindOfClass:[UIButton class]])
    {
        UIButton *cancelButton = (UIButton*)possibleButton;
        cancelButton.hidden = YES;
        break;
    }
}