我知道之前曾多次询问过这个问题,并且已经解决了(在我使用iOS4和5的解决方案之前)。我最近的项目涉及将UISearchBar
与其他一些视图一起使用,并且我希望在它变为活动状态时显示它的范围按钮。之前,在UISearchBardelegate
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
我正在做的事情
[searchBar setShowsScopeBar:YES];
[searchBar sizeToFit];
它显示了范围按钮。但现在,在iOS6上,这段代码什么也没做。在IB中添加了UISearchBar
,它的委托被设置为我的视图控制器。
有人解决这个问题吗?提前谢谢。
答案 0 :(得分:7)
看起来发生的事情是UISearchBar
在显示和隐藏范围栏时无法使其内在内容大小无效。
在UIKit修复之前,通过简单地对UISearchBar
进行子类化并覆盖单个方法,可以非常轻松地解决它:
- (void)setShowsScopeBar:(BOOL)showsScopeBar {
if ([self showsScopeBar] != showsScopeBar) {
[self invalidateIntrinsicContentSize];
}
[super setShowsScopeBar:showsScopeBar];
}
答案 1 :(得分:2)
我向Apple报告这是一个错误,并得到了如何修复它的答案:
只是将UISearchBar子类化并覆盖-setShowsScopeBar:
- (void)setShowsScopeBar:(BOOL)showsScopeBar
{
if (self.showsScopeBar != !!showsScopeBar) [self invalidateIntrinsicContentSize];
[super setShowsScopeBar:showsScopeBar];
}
更新:这已在iOS 7中修复。
答案 2 :(得分:1)
好吧,问题出在iOS 6自动布局的事情上,一旦我把它删除,问题就消失了。谢谢大家:)
答案 3 :(得分:0)
另一种在iOS 6.0中执行此操作而无需子类化UISearchBar的方法只是调整搜索栏代表中的帧大小:
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
NSMutableArray *ma = [NSMutableArray arrayWithCapacity:2];
[ma addObject:@"One"];
[ma addObject:@"Two"];
CGRect f = searchBar.frame;
f.size.height += 44.0f;
searchBar.frame = f;
searchBar.scopeButtonTitles = [ma copy];
searchBar.showsScopeBar = YES;
}
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
CGRect f = searchBar.frame;
f.size.height -= 44.0f;
_searchBar.frame = f;
searchBar.scopeButtonTitles = nil;
searchBar.showsScopeBar = NO;
}