如何将UISearchController的searchBar内边距调整为25px?
调整UISearchBar内边距的实用方案(无需自定义搜索栏)
绝对没必要从零搭建搜索栏!针对UISearchBar默认16px左右内边距的问题,有好几套实用方案——从官方合规的手段到低风险的技巧,帮你完美匹配25px的边距要求:
1. 官方合规方案:利用公开API调整内部文本框(iOS 13+)
从iOS 13开始,UISearchBar公开了searchTextField属性,我们可以直接通过它调整内边距,完全符合苹果审核规范:
extension UISearchBar { func setUniformPadding(_ padding: CGFloat) { guard let textField = self.searchTextField else { return } // 调整左侧搜索图标与文本的间距(默认图标占8px,所以这里减去8px让整体左内边距为padding) textField.leftView?.frame = CGRect(x: 0, y: 0, width: padding - 8, height: textField.leftView!.frame.height) // 设置文本框本身的左右内边距 textField.layoutMargins = UIEdgeInsets(top: 0, left: padding, bottom: 0, right: padding) } }
使用时直接在你的UISearchController初始化后调用:
let searchController = UISearchController(searchResultsController: nil) searchController.searchBar.setUniformPadding(25)
这个方案最稳妥,不会有审核风险,也能完美适配系统的交互逻辑。
2. 全局统一方案:方法混写(Swizzling)
如果你的App所有搜索栏都需要统一的25px内边距,可以用方法混写来全局修改UISearchBar的布局逻辑,避免重复代码:
extension UISearchBar { static func setupGlobalUniformPadding(_ padding: CGFloat = 25) { let originalLayoutSelector = #selector(layoutSubviews) let swizzledLayoutSelector = #selector(customLayoutSubviews) guard let originalMethod = class_getInstanceMethod(self, originalLayoutSelector), let swizzledMethod = class_getInstanceMethod(self, swizzledLayoutSelector) else { return } // 关联padding值到类对象 objc_setAssociatedObject(self, &AssociatedKeys.paddingKey, padding, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) method_exchangeImplementations(originalMethod, swizzledMethod) } @objc private func customLayoutSubviews() { // 先执行原布局逻辑 customLayoutSubviews() // 应用自定义内边距 guard let padding = objc_getAssociatedObject(UISearchBar.self, &AssociatedKeys.paddingKey) as? CGFloat else { return } setUniformPadding(padding) } } private struct AssociatedKeys { static var paddingKey = "UISearchBarGlobalPaddingKey" }
在AppDelegate的didFinishLaunchingWithOptions或者SceneDelegate的scene(_:willConnectTo:options:)中调用:
UISearchBar.setupGlobalUniformPadding(25)
方法混写虽然属于“黑魔法”,但这里只是修改UISearchBar自身的布局逻辑,风险极低,苹果审核一般不会卡。
3. 兼容老系统方案:访问私有属性(慎用)
如果需要兼容iOS 13以下的版本,可以通过KVC访问UISearchBar的私有_searchField属性来调整内边距:
extension UISearchBar { func setLegacyUniformPadding(_ padding: CGFloat) { guard let textField = value(forKey: "_searchField") as? UITextField else { return } textField.leftView?.frame = CGRect(x: 0, y: 0, width: padding - 8, height: textField.leftView!.frame.height) textField.layoutMargins = UIEdgeInsets(top: 0, left: padding, bottom: 0, right: padding) } }
这个方案需要注意:私有属性可能在未来iOS版本中被修改,所以建议配合版本判断使用,优先用公开API。
内容的提问来源于stack exchange,提问作者Oscar Apeland
相关产品推荐
相关产品推荐

