UISearchBar在单击时修改其框架/边界

时间:2017-10-25 18:53:32

标签: ios objective-c xcode interface-builder

我正在尝试在我的应用UI中放置一个UISearchController。布局是:

  • 黄色:一个ViewController
  • 红色:另一个ViewController
  • 黑色:YellowViewController中的容器

enter image description here

我想将UISearchController的UISearchView放在黑色容器中。

我的代码如下:

self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsViewController];
UISearchBar* searchBar = self.searchController.searchBar;
searchBar.frame =_searchBarContainer.bounds;
[_searchBarContainer addSubview:searchBar];
[_searchBarContainer layoutIfNeeded];

它将UISearchBar放在正确的位置:

enter image description here

但是当我选择搜索字段时,它会扩展容器边界上的栏:

enter image description here

如何解决这个问题,并在选择时避免尺寸/外观变化?

注意:尝试使用translatesAutoresizingMaskIntoConstraintsclipToBounds选项的一些选项但没有成功。我不是iOS UI的专家,所以我很感激准确的答案。感谢

2 个答案:

答案 0 :(得分:2)

根据我的研究,每次选择SearchBar时,都会显示UISearchController。此UISearchController始终会尝试将searchBar的宽度等于呈现UIViewController的{​​{1}}。

我的解决方案是当UISearchController使UISearchController框架错误时,再次设置SearchBar'框架。您可以尝试以下代码。

SearchBar

至少,它有效:)

或者

  • 如果你的案例没有任何问题,你可以创建另一个包含@interface ViewController () <UISearchControllerDelegate> @property (nonatomic, strong) UISearchController* searchController; @property (weak, nonatomic) IBOutlet UIView *searchBarContainer; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsViewController]; UISearchBar* searchBar = self.searchController.searchBar; self.searchController.delegate = self; searchBar.frame =_searchBarContainer.bounds; [_searchBarContainer addSubview:searchBar]; [_searchBarContainer layoutIfNeeded]; } - (void)willPresentSearchController:(UISearchController *)searchController { [searchController.searchBar addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:nil]; } - (void)willDismissSearchController:(UISearchController *)searchController{ [searchController.searchBar removeObserver:self forKeyPath:@"frame"]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context { if (object == self.searchController.searchBar) { if (!CGSizeEqualToSize(self.searchController.searchBar.frame.size, _searchBarContainer.frame.size)) { self.searchController.searchBar.superview.clipsToBounds = NO; self.searchController.searchBar.frame = CGRectMake(0, 0, _searchBarContainer.frame.size.width, _searchBarContainer.frame.size.height); } } } @end 的{​​{1}},然后将其添加到_searchBarContainer。
  • 使用UIViewControllerSearchBar代替UISearchBar。它更容易处理。

答案 1 :(得分:1)

我找到了有用的信息。

点击UISearchBar时会调用几种方法。 当调用某些方法时,UISearchBar的框架会改变其值。

其中一种方法尝试将宽度填充为UIViewController

尝试在其中一种方法中设置帧值:

  

searchBarTextDidBeginEditing
  searchBarShouldBeginEditing

以这种方式覆盖默认值。

再见