iPhone X中inputAccessoryView的autoResizingMask失效问题求助
iPhone X inputAccessoryView AutoResizingMask 适配问题解决方案
我之前也碰到过这个问题,iPhone X及后续带底部安全区域的机型,确实会让inputAccessoryView的AutoResizingMask出现失效的情况,给你两个实用的解决思路:
方法一:改用AutoLayout替代AutoResizingMask(推荐)
AutoLayout在适配安全区域时灵活性更强,能避免AutoResizingMask的局限性。你可以按以下步骤调整:
- 关闭自定义视图的自动约束转换:
在viewDidLoad里添加代码,禁止系统将AutoResizingMask自动转换为AutoLayout约束:
override func viewDidLoad() { super.viewDidLoad() textFieldContainer.translatesAutoresizingMaskIntoConstraints = false // 其他原有代码... }
- 添加明确的AutoLayout约束:
直接关联到视图的安全区域,确保底部适配iPhone X的圆角区域:
NSLayoutConstraint.activate([ textFieldContainer.leadingAnchor.constraint(equalTo: view.leadingAnchor), textFieldContainer.trailingAnchor.constraint(equalTo: view.trailingAnchor), textFieldContainer.heightAnchor.constraint(equalToConstant: 60), // 替换成你需要的高度 textFieldContainer.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor) ])
方法二:修复AutoResizingMask的适配逻辑
如果你坚持使用AutoResizingMask,可以通过重写自定义视图的layoutSubviews方法,手动适配底部安全区域:
- 给
textFieldContainer创建自定义子类并重写布局方法:
class CustomInputAccessoryView: UIView { override func layoutSubviews() { super.layoutSubviews() guard #available(iOS 11.0, *) else { return } // 获取底部安全区域高度 let bottomSafeAreaInset = UIApplication.shared.keyWindow?.safeAreaInsets.bottom ?? 0 // 调整视图frame,兼容安全区域 var newFrame = self.frame newFrame.size.height += bottomSafeAreaInset newFrame.origin.y -= bottomSafeAreaInset self.frame = newFrame // 保留AutoResizingMask的原有适配逻辑 self.autoresizingMask = [.flexibleWidth, .flexibleTopMargin] } }
- 把Storyboard里的
textFieldContainer类改成这个自定义子类,保持原有的inputAccessoryView重写逻辑不变。
额外提醒:确保ViewController的automaticallyAdjustsScrollViewInsets属性为true(默认值),避免滚动视图的insets干扰inputAccessoryView的布局。
内容的提问来源于stack exchange,提问作者Muhammad Hassan
相关产品推荐
相关产品推荐

