更改UISearchBar TextField的大小?

我有一个索引在一边的UITableView; 我想添加一个UISearchBar到它,但索引重叠与“X”清除search。 我注意到在联系人应用程序,UISearchBar内的文本字段resize,以适应这一点,但我不能解决如何在我自己的应用程序中做到这一点。

我已经在我的viewDidLoad尝试了以下,但它似乎并没有工作。

UITextField * textField = (UITextField *)[[self.search subviews] objectAtIndex:0]; CGRect r = textField.frame; [textField setFrame:CGRectMake(r.origin.x, r.origin.y, r.size.height, r.size.width-30)]; 

有任何想法吗?

这比所有这些build议都容易得多。 在界面生成器中,不是将search栏作为表格视图的标题,而是可以放置视图。 然后,在这个视图中放置一个导航栏。 抓住导航栏的左侧resize的手柄并将其向右拉,直到NB只有25像素宽。 在NB中清除标题(双击选中,然后删除)。 然后,将一个search栏添加到相同的视图。 将右边的大小调整手柄向左移动,调整到与N B邻接。就是这样。

你也可以启用一个取消button,如果你也想要,它也不会重叠索引(保持在search栏内)。

显然,一个表视图的标题只能有一个子视图,这就是为什么你需要把视图放在其中,然后是NB和search栏。

更新:请参阅从Apress开始iPhone开发,p。 SDK 3版241。 您只需在search时禁用索引。

 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { if (isSearching) { return nil; } return keys; } 

他们还谈到在指数顶部添加一个放大镜。

好书在周围。

为什么不把水平实际的UISearchBar缩小一点,并在其右侧放置一个(空的)UINavigationBar? 他们将呈现完全相同的背景。

比侵入可能改变的苹果物体的内部更好。

此外,animationUISearchBar的宽度时,您会注意到内部文本字段不与它一起animation。 您可以通过在更改框架后在animation块中调用UISearchBar的“layoutSubviews”来解决此问题。 (这是确定内部文本字段的大小的地方)

好的,我已经想出了一个解决scheme。

  1. 创buildUISearchBar的子类
  2. 将此代码包含在drawRect:方法中。

     UITextView * textField = [self.subviews objectAtIndex:0]; textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31); [super drawRect:rect]; 

注意:kRightSideMargin是我在我的头文件中设置的常量。 我已经设置为25。

感谢其他人的build议。

正如Padraig指出的,你所要做的就是将searchBar分类出来。 创build您的UISearchBar子类,并将下面的代码添加到layoutSubviews方法中:

 - (void)layoutSubviews { UITextField *searchField; for(int i = 0; i < [self.subviews count]; i++) { if([[self.subviews objectAtIndex:i] isKindOfClass:[UITextField class]]) { searchField = [self.subviews objectAtIndex:i]; } } if(!(searchField == nil)) { searchField.frame = CGRectMake(4, 5, 285, 30); } } 

这循环遍历所有的子视图,并检查他们对UITextFieldtypes。 这样,如果它的排列顺序的子视图,这仍然会抓住它。 我发现285足够宽,不与我的tableView索引重叠。

从iOS 6开始,导航栏解决scheme对我来说效果不佳,因为UISearchBar和UINavigationBar之间的外观略有不同。 所以,我通过inheritanceUISearchBar来切换到类似于Padraig的方法。

 @interface SearchBarWithPad : UISearchBar @end @implementation SearchBarWithPad - (void) layoutSubviews { [super layoutSubviews]; NSInteger pad = 50; for (UIView *view in self.subviews) { if ([view isKindOfClass: [UITextField class]]) view.frame = CGRectMake (view.frame.origin.x, view.frame.origin.y, view.frame.size.width - pad, view.frame.size.height); } } @end 

编辑:啊,我还没有尝试过,但我认为你可以设置导航栏的clipToBounds = YESclosures它的新阴影,从而在两个控件之间再次创build一致的外观。

我正在使用ViewDeck,并希望显示leftController 的UISearchbar。

现在问题是如果我打开包含导航的左侧,正确的位重叠我的search字段。

我通过写UISearchBar摆脱了这一点,文本字段将始终具有相同的宽度,但在一种情况下有ViewDeck重叠,在另一种情况下,我隐藏ViewDeck位,然后取消button将占用的空间:

子类化UISearchBar

 #import "ViewDeckSearchBar.h" #define kViewDeckPadding 55 @interface ViewDeckSearchBar() @property (readonly) UITextField *textField; @end @implementation ViewDeckSearchBar static CGRect initialTextFieldFrame; - (void) layoutSubviews { [super layoutSubviews]; // Store the initial frame for the the text field static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ initialTextFieldFrame = self.textField.frame; }); [self updateTextFieldFrame]; } -(void)updateTextFieldFrame{ int width = initialTextFieldFrame.size.width - (kViewDeckPadding + 6); CGRect newFrame = CGRectMake (self.textField.frame.origin.x, self.textField.frame.origin.y, width, self.textField.frame.size.height); self.textField.frame = newFrame; } -(UITextField *)textField{ for (UIView *view in self.subviews) { if ([view isKindOfClass: [UITextField class]]){ return (UITextField *)view; } } return nil; } @end 

ViewController类

在我的导航类中,我需要覆盖这两个UISearchbarDelegate方法,以便全屏显示search结果:

 - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{ [self.viewDeckController setLeftSize:0]; // I am also using scopes, which works fine (they fade out when not searching) self.searchBar.scopeButtonTitles = @[@"Food", @"Beverages", @"Misc"]; } -(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{ self.viewDeckController.leftSize = 55; } 

结果

ViewDeck显示在右边:

一个http://i5.minus.com/jA34MnXVqPZez.png

全屏search(button和范围button在中animation)。

一个http://i2.minus.com/jjKEgXLur1kH6.png

对不起,再次拖动这一切。

我想UISearchBar更短,我使用UISearchBarController,但实际上并不想索引。 这是因为我有一个覆盖在右边:

长搜索栏

要做到这一点,我伪造一个空白项的sectionIndex,然后隐藏它。 以下是我如何做到这一点:

  - (void)hideTableIndex { for (UIView *view in [tableView subviews]) { if ([view isKindOfClass:NSClassFromString(@"UITableViewIndex")]) { view.hidden = YES; } } } - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)aTableView { if (aTableView == self.searchDisplayController.searchResultsTableView) { return nil; } else { [self performSelector:@selector(hideTableIndex) withObject:nil afterDelay:0]; return [NSArray arrayWithObjects:@"", nil]; } } - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { return 0; } 

这缩短了UISearchBar并隐藏索引,所以它不能被挖掘(一个小的部分,否则将左侧的覆盖,当点击将滚动UITableView顶部)。 喜欢这个:

替代文字

最重要的是,当你使用search,你仍然可以得到全宽栏:

替代文字

只要把一个UIView,并把search栏里面的UIView。 UIView必须与UISearchBar大小相同。 这对我工作。

UISearchBar中使用的文本字段是UITextField的一个名为UISearchBarTextField的子类。

AFAIK,没有办法使用公共API调整UISearchBarTextField的大小, 私有API也不会透露很多。

也许你可以看看UISearchBarTextField的子视图,如果有的话。

更新:它没有。

更新2:我想你应该看看UITextField的rightView属性。 下面的代码虽然不起作用,但似乎是一个很好的起点:

 UIView *emptyView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 25, 25)]; [textField setRightView:emptyView]; [textField setRightViewMode:UITextFieldViewModeAlways]; [emptyView release]; 

对不起,对于Necroposting,但我发现另一种方法来在文本框的右侧留出一点空间。 我遇到了问题,我有一个索引tableview与search栏作为第一行。 现在索引和search栏(在IB中制作,顺便说一句)是重叠的。 它尝试了几乎所有没有成功的东西。 看来,textifield的宽度和高度属性没有反应…所以我想出了这个:

 searchBar.showsCancelButton = YES; UIView *cButton = [searchBar.subviews objectAtIndex:2]; cButton.hidden = YES; 

我仍然无法调整空间的大小,但现在这样做…虽然…很奇怪的解决scheme…

每个人都提供了修改UI的方法。 我发现了如何获得相同的结果。 您必须提供以下两个实现:

  1. 使用UISearchDisplayController更重要的是,确保你使用下面的方法初始化它:
 - (id)initWithSearchBar:(UISearchBar *)searchBar contentsController:(UIViewController *)viewController 

未能设置有效的UISearchBar(或传递零)将阻止索引的UITextField的调整。

  1. 您必须通过执行以下内容来返回有效的标题数组:
 - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView; 

如果返回零,索引将不会显示,并且UITextField将不会被正确调整。

我向苹果公司提交了一个错误报告,表明看起来合乎逻辑的是,只有#2应该被要求,而不是#1。 我没有发现任何需要使用UISearchDisplayController的Human Interface Guideline(iPhone HIG)。

关键是在使用Interface Builder时使用“search栏和search显示控制器”而不是“search栏”。

它看起来好像苹果调整了视图(请注意,索引是右边的,在屏幕外),使它比屏幕更大。

我会想象你需要实现UISearchBarDelegatesearchBarTextDidBeginEditing:方法来触发这个在适当的点。 但是,这确实有点不好意思,也许有更好的办法。

另一个方法(尽pipe乏味)是调整search栏的大小,并用导航栏填充“间隙”。 为我工作。

我想到的并不是太好。 基本上,我用我想用于search栏的框架做一个空的视图。 然后我创build一个UIToolbar去search栏后面。 除了 Y值必须是-1 以外 ,一定要将其框架设置为与UIView相同的框架。 否则,您会在顶部绘制两个边框。 接下来创build你的UISearchBar,但是将框架的宽度设置为30(或者对你的应用程序有意义)比UIView小。 将它们添加为子视图并将您的UIView设置为tableHeaderView。

我通过制作一个UIView来跟踪Mike的build议,然后在里面放置一个Navigation Bar和UISearch Bar。 唯一的问题是第一次显示search栏的背景与导航栏通常是一样的吗?

有趣的是,如果我激活search,然后点击取消这个“固定”的背景!

我使用的是SDK 3.0,所以当我将UISearchDisplayController拖到我的NIB中时,我删除了UISearchBar项目,然后按上述方法制作了视图,并将其连接到search显示控制器中的文件所有者和searchBarsockets。

它工作正常!

[searchBar setContentInset:UIEdgeInsetsMake(5, 0, 5, 35)];