如何让UIBarButtonItems在各设备屏幕边缘保持相同偏移量
嘿,这个问题我太熟了!之前帮好几个开发者搞定过不同尺寸iPhone上UINavigationBar按钮边缘偏移不一致的问题——苹果默认在小屏和大屏设备上给UIBarButtonItem的边距是不一样的,光用alignmentRectInsets确实搞不定,给你几个靠谱的解决方案:
自定义容器视图控制偏移(最推荐)
直接用一个UIView作为UIBarButtonItem的customView,把按钮放在这个容器里,自己设置按钮和容器的约束,从而完全掌控和屏幕边缘的距离。代码示例:func makeFixedOffsetBarButton(title: String, action: Selector) -> UIBarButtonItem { let button = UIButton(type: .system) button.setTitle(title, for: .normal) button.addTarget(self, action: action, for: .touchUpInside) let container = UIView() container.addSubview(button) button.translatesAutoresizingMaskIntoConstraints = false // 这里的constant值就是你想要的固定偏移,比如左右各8pt NSLayoutConstraint.activate([ button.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 8), button.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -8), button.topAnchor.constraint(equalTo: container.topAnchor), button.bottomAnchor.constraint(equalTo: container.bottomAnchor) ]) return UIBarButtonItem(customView: container) }这样不管是iPhone 5s还是6s+,按钮和屏幕边缘的距离都会严格按照你设置的数值来,完全不受系统默认边距影响。
为什么
alignmentRectInsets没用?
这个属性是用来调整UIBarButtonItem自身的对齐矩形范围,比如让按钮在导航栏里的垂直/水平对齐位置变化,但它管不了导航栏给按钮容器预留的默认边缘间距——这个间距是系统根据设备尺寸硬编码的,所以单独改这个属性解决不了问题。全局统一设置(可选)
如果你的APP所有导航栏按钮都要统一偏移,可以写一个UIBarButtonItem的扩展,封装上面的自定义容器逻辑,这样不用每个按钮都重复写代码:extension UIBarButtonItem { static func fixedOffsetButton(title: String, target: Any?, action: Selector) -> UIBarButtonItem { let button = UIButton(type: .system) button.setTitle(title, for: .normal) button.addTarget(target, action: action, for: .touchUpInside) let container = UIView() container.addSubview(button) button.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ button.leadingAnchor.constraint(equalTo: container.leadingAnchor, constant: 8), button.trailingAnchor.constraint(equalTo: container.trailingAnchor, constant: -8), button.topAnchor.constraint(equalTo: container.topAnchor), button.bottomAnchor.constraint(equalTo: container.bottomAnchor) ]) return UIBarButtonItem(customView: container) } }用的时候直接
UIBarButtonItem.fixedOffsetButton(title: "返回", target: self, action: #selector(backAction))就行。
内容的提问来源于stack exchange,提问作者HelloimDarius
相关产品推荐
相关产品推荐

