如何在UISearchBar中的范围按钮上设置不同的宽度?

时间:2014-08-14 09:46:02

标签: ios objective-c uisearchbar uisegmentedcontrol

我有一点问题,但还没有找到任何解决方案。

我的应用中有UISearchBar ScopeBarScopeBar包括4个范围按钮。目前所有这些都有相同的宽度。

我的一个按钮的文本比其他按钮长。在我的情况下,文本被截断。它看起来像:

[  short  |  short  |longte...|  short  ]

显示整个文本没有问题,如果我可以最小化短按钮的宽度并将一些像素添加到第三个按钮。

第一个问题: 是否可以设置不同的按钮尺寸?

第二个: 如果是的话,我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

我认为不可能使用公共API直接从UISegmentedControl访问UISearchBar(范围栏)的属性。

解决此问题的一种方法是访问UISegmentedControl是使用UISearchBar_scopeBar的私有属性。

这样做的一个简洁方法是在UISearchBar上声明一个类别以公开此属性:

@interface UISearchBar (ExposeScopeBar)

@property (readonly) UISegmentedControl *_scopeBar;

@end

然后,您所要做的就是访问范围栏(这是一个经典的UISegmentedControl),并将其apportionsSegmentWidthsByContent属性设置为true:

self.searchBar._scopeBar.apportionsSegmentWidthsByContent = YES;

scope bar after modifications

如果您需要对细分受众群规模进行更细粒度的控制,您还可以使用UISegmentedControl UISegmentedControl方法。

请注意,虽然这会使用私有的UIKit API,而会有一个更改,您的应用将从App Store中被拒绝


另一种选择是递归搜索UISearchBar视图层次结构中的- (UISegmentedControl *)scopeBarForSearchBar:(UISearchBar *)searchBar { return [self scopeBarInViewHierarchy:searchBar]; } - (UISegmentedControl *)scopeBarInViewHierarchy:(UIView *)view { if ([view isKindOfClass:[UISegmentedControl class]]) { return view; } for (UIView *child in [view subviews]) { UIView *result = [self scopeBarInViewHierarchy:child]; if (result) { return result; } } return nil; } ,而不是使用私有属性。

以下是执行此操作的伪代码段:

{{1}}

再次:这是伪代码。未经测试。

此解决方案不使用私有API,因此它应该毫无问题地通过App Store验证。