【问题标题】:UISearchBar's scope button won't show up iOS6UISearchBar 范围按钮不会显示 iOS 6
【发布时间】:2012-10-22 10:06:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: iphone objective-c ios ios6


    【解决方案1】:

    看起来发生了什么是UISearchBar 在显示和隐藏范围栏时未能使其固有内容大小无效。

    直到它在 UIKit 中得到修复,通过简单地继承 UISearchBar 并覆盖单个方法来解决它是非常容易的:

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

    【讨论】:

    • 谢谢,不管怎样,我会等待自动布局变得更稳定...在那之前,稍后再见autoLayout ;)
    • 感谢您的回答!如此简单的修复。
    【解决方案2】:

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

    只需继承 UISearchBar 并覆盖 -setShowsScopeBar:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 请考虑在发布答案之前阅读其他答案:)
        • @Fahri,我真的不明白你评论的重点。我确实阅读了其他答案,并提供了一个对我有用并可能对其他人有所帮助的替代方案。你有什么问题?
        • 理想情况下,不再调整框架。如果可能,最好使用约束,以便界面根据需要更加流畅和动态。
        猜你喜欢
        • 2013-11-22
        • 1970-01-01
        • 1970-01-01
        • 2018-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多