我有一个带有索引的UITableView; 我想为它添加一个UISearchBar,但索引与"x"重叠以清除搜索.我已经注意到在Contacts应用程序中,UISearchBar中的文本字段被调整大小以适应这一点,但我无法弄清楚如何在我自己的应用程序中执行此操作.
我在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)];
有任何想法吗?
它比所有这些建议容易得多.在界面构建器中,您可以放置View,而不是将搜索栏作为表视图的标题.然后,在此视图中放置导航栏.抓住导航栏的左侧调整大小手柄并将其向右拉,直到NB仅为25像素宽.清除NB中的标题(双击以选中它,然后删除).然后,将搜索栏添加到同一视图中.将其右侧调整大小手柄向左移动,调整使其与N B相邻.就是这样.
如果需要,也可以启用取消按钮,它也不会与索引重叠(保留在搜索栏中).
显然,表格视图在其标题中只能有1个子视图,这就是为什么你需要先放置视图,然后放入NB和搜索栏.
更新:请参阅Apress的iPhone开发.SDK 3版本的241.您只需在搜索时禁用索引.
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { if (isSearching) { return nil; } return keys; }
他们还谈到在索引顶部添加放大镜.
好书周围.
为什么不只是将实际的UISearchBar水平放大,并将(空)UINavigationBar放在它的右边?它们将呈现完全相同的背景.
比攻击可能改变的Apple对象的内部更好.
此外,在动画UISearchBar的宽度时,您会注意到内部文本字段不随其动画.您可以通过在更改其框架后调用动画块中的UISearchBar的"layoutSubviews"来解决此问题.(这就是确定内部文本字段大小的位置)
好的,我想出了一个解决方案.
创建UISearchBar的子类
在drawRect:方法中包含此代码.
UITextView * textField = [self.subviews objectAtIndex:0]; textField.frame = CGRectMake(5, 6, (310 - kRightSideMargin), 31); [super drawRect:rect];
注意:kRightSideMargin是我在头文件中设置的常量; 我把它设置为25.
感谢大家的建议.
正如Padraig所指出的,你要做的就是将searchBar子类化.创建您的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); } }
这将遍历所有子视图并根据类型UITextField进行检查.这样一来,如果它在其子视图的排列中移动,这仍然会抓住它.我发现285只是足够宽,不会与我的tableView的索引重叠.
从iOS 6开始,导航栏解决方案对我来说效果不佳,因为现在UISearchBar和UINavigationBar之间的外观略有不同.因此,我通过子类化UISearchBar切换到类似于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 = YES来关闭它的新阴影,从而在两个控件之间再次创建一致的外观.
我使用的观景台,并要显示一个UISearchBar 内的leftController
.
现在的问题是如果我打开包含导航的左侧,右侧的位与我的搜索字段重叠.
我通过写过去UISearchBar
除了这个,文本字段将始终具有相同的宽度,但在一种情况下,ViewDeck重叠,在另一种情况下,我隐藏ViewDeck位,然后取消按钮将占用空间:
#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
在我的Navigation类中,我需要覆盖这两个UISearchbarDelegate
方法,以便使用搜索结果进入全屏:
- (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
在全屏搜索(按钮和范围按钮是动画的).
一个http://i2.minus.com/jjKEgXLur1kH6.png