UISearchBar 在向下滚动之前不可见
Posted
技术标签:
【中文标题】UISearchBar 在向下滚动之前不可见【英文标题】:UISearchBar not visible until scroll down 【发布时间】:2015-01-24 14:34:23 【问题描述】:我以编程方式向 tableHeaderView 添加了 UISearchBar,但它没有在视图加载时显示。 我的表格内容上方只有一个空白区域。当我向下滚动一点时,它会出现。 我更改了 tableHeaderView 的背景颜色以查看它是否完全可见 - 我可以看到更改后的颜色,因此 searchBar 本身似乎是不可见的。 有什么想法吗?
这是我的代码:
- (void)viewDidLoad
[super viewDidLoad];
...
// Initialize the refresh control.
[self.refreshControl addTarget:self
action:@selector(refreshData)
forControlEvents:UIControlEventValueChanged];
// Suchelemente erzeugen
self.searchBar = [UISearchBar new];
self.searchDC = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
self.searchDC.searchResultsDelegate = self;
self.searchDC.delegate = self;
self.searchDC.searchResultsDataSource = self;
self.tableView.tableHeaderView = self.searchBar;
// some attempts to make it visible
self.searchBar.hidden = NO;
self.searchBar.layer.hidden = NO;
[self.searchBar sizeToFit];
好的,发现是刷新控件导致了问题。 在 viewWillAppear 中调用了一个方法来更新刷新控件的标题。当我评论这一行时,会出现搜索栏:
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:title];
那么,如何让它们都工作呢?
【问题讨论】:
您是在 tableview 标题中添加其他内容还是将其 contentOffset 设置为某些内容? 我为表格视图控制器的 refreshControl 属性分配了一个刷新控件。不知道是不是也放在tableview header中? 你在使用故事板吗? 是的,但不是搜索栏或刷新控件。 【参考方案1】:你可以设置:
self.navigationItem.hidesSearchBarWhenScrolling = NO;
【讨论】:
【参考方案2】:创建一个刷新控件并将其设置为tableview的刷新控件。这样self.refreshcontrol
的属性文本就没有设置了。
UIRefreshControl *refresh = [[UIRefreshControl alloc] init];
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:GetLocalizedString(@"REFRESH_TO_RELEASE_TITLE", nil)];
[refresh addTarget:self action:@selector(refreshViewPulled:) forControlEvents:UIControlEventValueChanged];
self.refreshControl=refresh;
【讨论】:
请使用 4 个空格而不是反引号来格式化您的代码块。 不错。我直接设置 self.refreshControl 并首先创建一个局部变量然后设置它工作。不太清楚为什么它仍然没有给出自我版本的属性文本,但是嘿,它有效!【参考方案3】:我遇到了同样的问题。我通过务实地调整内容偏移来修复它,以便触发橡皮筋滚动动画,导致 UISearchBar 重新出现。
如果不可见,试试这个:
[self.tableView setContentOffset:CGPointMake(0, -1) animated:NO];
【讨论】:
【参考方案4】:问题是因为您尝试将 2 个东西添加到同一个位置,因为您从未真正为任何一个指定框架,即使 UIResultsController 知道它的去向,它可以更改,并且 UIControlEventValueChanged [向下拖动] 可能是造成帧变化的差异。所以我建议通过情节提要来实现你的搜索栏,因为你说你正在使用它。将 Search Display Controller 拖放到 Navigation Bar 下方但 Table View 上方,您会看到光标变为绿色加号,这意味着您可以将其拖放到那里(在本例中是 tableViewHeader):
然后你应该能够继续务实地改变 UIRefreshControl 正常
-(void)viewDidLoad
self.refreshControl = [[UIRefreshControl alloc] init];
self.refreshControl.backgroundColor = [UIColor clearColor];
self.refreshControl.tintColor = [UIColor purpleColor];
[self.refreshControl addTarget:self
action:@selector(refreshView:)
forControlEvents:UIControlEventValueChanged]
self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull down to Refresh.."];
现在添加到同一位置的两个项目应该不会有冲突的框架更改。
【讨论】:
感谢您提供详细的提示。试过了,但没有任何改变。我的下一次尝试也是将 IB 用于 refreshControl,但这意味着在我的项目中进行很多更改,因为它尚未在我的 tableViewController 的超类中定义 - 也许这就是问题... @Markus 你不必在 IB 中创建 UIRefreshControl以上是关于UISearchBar 在向下滚动之前不可见的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C - 滚动时 UISearchController 结果在 UISearchBar 上重叠
保持 uisearchbar 在 uitableview 中始终可见