我正在尝试在我的应用UI中放置一个UISearchController。布局是:
我想将UISearchController的UISearchView放在黑色容器中。
我的代码如下:
self.searchController = [[UISearchController alloc] initWithSearchResultsController:searchResultsViewController];
UISearchBar* searchBar = self.searchController.searchBar;
searchBar.frame =_searchBarContainer.bounds;
[_searchBarContainer addSubview:searchBar];
[_searchBarContainer layoutIfNeeded];
它将UISearchBar放在正确的位置:
但是当我选择搜索字段时,它会扩展容器边界上的栏:
如何解决这个问题,并在选择时避免尺寸/外观变化?
注意:尝试使用translatesAutoresizingMaskIntoConstraints
和clipToBounds
选项的一些选项但没有成功。我不是iOS UI的专家,所以我很感激准确的答案。感谢
答案 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。UIViewController
和SearchBar
代替UISearchBar
。它更容易处理。答案 1 :(得分:1)
我找到了有用的信息。
点击UISearchBar时会调用几种方法。
当调用某些方法时,UISearchBar
的框架会改变其值。
其中一种方法尝试将宽度填充为UIViewController
。
尝试在其中一种方法中设置帧值:
searchBarTextDidBeginEditing
searchBarShouldBeginEditing
以这种方式覆盖默认值。
再见