我正在尝试设计一个UITableViewController,当用户点击导航栏上的“搜索”按钮时,表格视图会下降,UIView会从导航栏中下拉。然后,当用户点击UIView之外的任何地方时,UIView应该缩回并且表视图应该返回到其原始位置。
目前,我有以下方法,即“搜索”按钮的选择器。注意 - self.searchBar是一个自定义的UIView子类。
是否有更清洁/更好的方法来实现这一目标?在用户点击搜索菜单后,我也不确定如何摆脱视图......我猜我应该打电话,[self.searchBar removeFromSuperview];但不确定将该行放在哪个委托方法中。
谢谢!
- (void)_showSearchMenu
{
CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height * .25);
frame.origin.y = CGRectGetMaxY(self.navigationController.navigationBar.frame) - frame.size.height;
self.searchBar.frame = frame;
[self.navigationController.navigationBar.superview insertSubview:self.searchBar belowSubview:self.navigationController.navigationBar];
[UIView animateWithDuration:0.5 animations:^{
CGRect frame = self.searchBar.frame;
frame.origin.y = CGRectGetMaxY(self.navigationController.navigationBar.frame);
self.searchBar.frame = frame;
self.tableView.contentOffset = CGPointMake(0, -250);
}];
}
更清楚一点,我正在努力实现类似于HotelTonight应用程序中所见效果的东西(第二个屏幕显示当您点击右上方的按钮时会发生什么)
答案 0 :(得分:2)
我认为这是最好的方法,请使用这些代表:
(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)部分(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger的)部分
如何:
BOOL isOpen
,其默认值为NO
单击“搜索”按钮时,请执行以下操作:
(void) searchButtonTouch:(id)sender {
isOpen = (isOpen) ? YES : NO;
isOpen = !isOpen;
[self.urTableView reloadData];
}
现在在你的代表中:
(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return (isOpen) ? 170.0f : 0.0f;
}
(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
CGFloat height = [self tableView:tableView heightForHeaderInSection:section];
UIView *vw = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, height)];
vw.backgroundColor = [UIColor yellowColor];
// add other controls here in your UIView
// or
// just add a UIView at top of your UITableView
// then add other controls to it (if ur using storyboard)
return vw;
}
答案 1 :(得分:0)