gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:21:54 29 4
gpt4 key购买 nike

我正在尝试在我的应用程序 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 的专家,所以我希望得到准确的答案。谢谢

最佳答案

根据我的研究,每次选择 SearchBar 时,都会显示一个 UISearchController。此 UISearchController 始终尝试使 searchBar 的宽度等于呈现 UISearchControllerUIViewController

我的解决方案是当UISearchController 使SearchBar 有错误的frame 时,重新设置SearchBar'frame。您可以尝试下面的代码。

@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

至少,它有效:)

或者

  • 您可以创建另一个包含 SearchBarUIViewController,如果您的案例对此没有任何问题,然后将其添加到 _searchBarContainer。
  • 使用 UISearchBarUITableView 而不是 UISearchController。它更容易处理。

关于ios - UISearchBar 在单击时修改其框架/边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46940042/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com