UISearchController的SearchBar被触摸时向下偏移若干像素问题
我之前也踩过这个一模一样的坑!当把UISearchController的SearchBar设置为导航栏的TitleView后,触摸时的向下跳动,本质是UISearchController内部默认的布局适配逻辑在搞鬼——它会误以为自己是在导航栏的搜索容器里,激活时自动调整位置。下面是几个亲测有效的解决方法:
方法1:禁用SearchController的自动布局调整
直接告诉UISearchController不要自动修改自己的位置,在初始化并配置它的时候加上关键设置:
Search = new UISearchController(searchResultsController: null); Search.SearchBar.SizeToFit(); // 核心设置:阻止激活时隐藏导航栏,避免位置偏移 Search.HidesNavigationBarDuringPresentation = false; // 适配部分iOS版本的额外设置 Search.Nobars = true; NavigationItem.TitleView = Search.SearchBar;
HidesNavigationBarDuringPresentation设为false是解决跳动的关键,它会阻止搜索控制器在激活时触发导航栏的隐藏逻辑,从根源上避免位置跳动。
方法2:给SearchBar套一层容器View
如果方法1在某些iOS版本下仍有小问题,可以把SearchBar放到一个UIView容器里,再将容器设为TitleView,通过固定容器尺寸来锁死搜索栏位置:
// 自定义容器尺寸,适配导航栏高度 var searchContainer = new UIView(new CGRect(0, 0, View.Frame.Width - 40, 44)); Search.SearchBar.Frame = searchContainer.Bounds; searchContainer.AddSubview(Search.SearchBar); NavigationItem.TitleView = searchContainer;
外层容器会牢牢固定住搜索栏的布局范围,不管UISearchController内部怎么调整,都不会出现整体偏移的情况。
方法3:用自动布局约束绑定位置
还有一种情况是搜索栏的内边距在激活时发生变化,我们可以通过自动布局约束把搜索栏和TitleView完全绑定:
Search.SearchBar.TranslatesAutoresizingMaskIntoConstraints = false; NavigationItem.TitleView = Search.SearchBar; // 添加约束强制固定搜索栏的位置和尺寸 NSLayoutConstraint.ActivateConstraints(new[] { Search.SearchBar.CenterXAnchor.ConstraintEqualTo(NavigationItem.TitleView.CenterXAnchor), Search.SearchBar.CenterYAnchor.ConstraintEqualTo(NavigationItem.TitleView.CenterYAnchor), Search.SearchBar.WidthAnchor.ConstraintEqualTo(NavigationItem.TitleView.WidthAnchor), Search.SearchBar.HeightAnchor.ConstraintEqualTo(NavigationItem.TitleView.HeightAnchor) });
这种方式能从布局层面彻底锁死搜索栏的位置,不会因为内部状态变化产生偏移。
另外,后续需要移除搜索栏时,记得正确释放资源避免内存泄漏:
IsShowingSearch = false; NavigationItem.TitleView = null; Search.Dispose(); Search = null;
内容的提问来源于stack exchange,提问作者jesopo
相关产品推荐
相关产品推荐

