macOS BigSur下重写NSButtonCell的drawTitle方法后按钮文字垂直居中异常问询
- 该问题由 Big Sur 对 NSButtonCell 内部布局逻辑的未公开私有调整导致:Mojave 及更早版本中,
drawTitle:withFrame:inView:仅负责文本绘制,传入的 frame 参数已经是经过垂直居中计算后的正确坐标;从 Big Sur 版本开始,原生 NSButtonCell 会在文本绘制前额外执行一次动态垂直偏移修正,该修正逻辑绑定了私有判断规则——当检测到当前子类重写了drawTitle:withFrame:inView:方法时,会直接跳过该修正步骤,使用原始未做居中处理的 frame 参数绘制文本,最终表现为文本紧贴控件底部。 - 系统的私有检测逻辑不关心重写后的实现内容,只要子类存在该方法的重写标记,就会触发上述逻辑,因此哪怕重写后仅透传调用父类方法,也会出现居中异常。
可通过调试验证两种场景下的 frame 参数差异:方法被重写时传入的 frame.origin.y 数值明显更大,文本绘制区域整体下移,和实际观测到的贴底表现完全吻合。
你提到的重写 titleRectForBounds 方案可以解决问题,是因为该方法是 AppKit 公开的布局回调,优先级高于内部私有修正逻辑,重写后返回的正确居中区域会直接被后续绘制流程采用,不受私有检测规则影响。
内容的提问来源于stack exchange,提问作者Mark Coniglio
相关产品推荐
相关产品推荐

