UIInputView子类中systemLayoutSizeFitting(_:)未调用问题求助
我之前在自定义UIInputView的时候也踩过这个坑,结合UIKit的布局逻辑,你可以从这几个方向排查:
缺少完整的自动布局约束链
UIKit调用systemLayoutSizeFitting(_:)的前提是,你的输入视图能通过自动布局约束推导出自身的intrinsic content size。如果你的子类内部控件没有设置足够的约束(比如没有将子视图的leading/trailing/top/bottom与输入视图本身关联,或者缺少宽/高方向的约束支撑),系统无法计算出合适的尺寸,就不会触发这个方法。比如你在自定义视图里放了一个UITextField,必须确保它的边缘和输入视图的边缘有约束,或者设置了明确的尺寸约束,让系统能基于内容算出整体大小。输入视图未关联到正确的UIResponder
UIInputView的尺寸计算逻辑只有在它被设置为某个UIResponder(比如UITextField、UITextView)的inputView或inputAccessoryView时才会被UIKit触发。如果你只是创建了自定义输入视图的实例,但没有把它赋值给某个响应者的对应属性,系统根本不会去处理它的布局计算,自然不会调用systemLayoutSizeFitting(_:)。一定要确保有类似textField.inputView = yourCustomInputView这样的代码。重写方法的签名不匹配(如果有重写的话)
如果你重写了systemLayoutSizeFitting(_:),要检查方法签名是否完全符合UIKit的要求。比如在Swift中,正确的签名应该是:override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize { // 你的实现 }如果签名写错(比如漏掉了优先级参数),系统会认为这是一个新方法,而不会调用你的重写实现,看起来就像原方法没被触发一样。
部署目标低于iOS 9.0
allowsSelfSizing属性是iOS 9.0才引入的API,如果你的项目Deployment Target设置低于iOS 9,这个属性实际上不会生效,UIKit还是会用旧的方式处理输入视图的尺寸,不会调用systemLayoutSizeFitting(_:)。检查一下项目的部署版本设置。被外部约束强制覆盖
虽然这种情况比较少见,但如果你的自定义输入视图被意外添加到了其他父视图中,并且父视图给它设置了固定的宽高约束(优先级高于内容适配的优先级),UIKit会优先遵循这些约束,而不会去调用systemLayoutSizeFitting(_:)。确保你的输入视图是直接作为inputView/inputAccessoryView使用,没有被额外添加到其他容器视图里。
内容的提问来源于stack exchange,提问作者Jordan H

