0

我知道这个问题之前被问过几次,并且已经解决了(在我使用 iOS4 和 5 的解决方案之前)。我最近的项目涉及UISearchBar与其他一些视图一起使用,我想在它变为活动状态时显示它的范围按钮。之前,UISearchBardelegate- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar在做

[searchBar setShowsScopeBar:YES];
[searchBar sizeToFit];

它显示范围按钮。但是现在,在 iOS6 上,这段代码什么都不做。UISearchBar在 IB 中添加,它的委托设置为我的视图控制器。有人有这个问题的解决方案吗?提前致谢。

4

4 回答 4

7

看起来正在发生的事情是UISearchBar当它显示和隐藏范围栏时未能使其内在内容大小无效。

UISearchBar直到它在 UIKit 中被修复之前,通过简单的子类化和覆盖单个方法来解决它是非常容易的:

- (void)setShowsScopeBar:(BOOL)showsScopeBar {
  if ([self showsScopeBar] != showsScopeBar) {
    [self invalidateIntrinsicContentSize];
  }
  [super setShowsScopeBar:showsScopeBar];
}
于 2012-12-21T22:23:25.260 回答
2

我将此作为错误报告给 Apple 并得到了解决方法的答案:

只需继承 UISearchBar 并覆盖 -setShowsScopeBar:

- (void)setShowsScopeBar:(BOOL)showsScopeBar
{
    if (self.showsScopeBar != !!showsScopeBar) [self invalidateIntrinsicContentSize];
    [super setShowsScopeBar:showsScopeBar];
}

更新:这在 iOS 7 中已修复。

于 2012-12-18T19:15:24.213 回答
1

好的,问题出在 iOS 6 自动布局的东西上,一旦我删除它,问题就消失了。谢谢大家 :)

于 2012-10-22T12:30:29.280 回答
0

在 iOS 6.0 中无需子类化 UISearchBar 的另一种方法是调整 Search Bar Delegate 中的帧大小:

- (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;
}
于 2013-02-16T20:10:48.847 回答