CustomView UIBarButtonItem 适用于 iPhone 6 以外的所有手机

CustomView UIBarButtonItem works for all phones other than iPhone 6

我使用以下代码创建了一个带有自定义视图的 UIBarButtonItem(我将 profileImageButton 框架的尺寸指定为 40x40)。

let profileImageButton = UIButton(type: .custom)
profileImageButton.frame = CGRect(x: 0, y: 0, width: 40, height: 40)
profileImageButton.setImage(imageCache.getProfileImage(), for: .normal)
profileImageButton.layer.cornerRadius = 20
profileImageButton.layer.masksToBounds = true
profileImageButton.addTarget(self, action: #selector(self.openSettings), for: .touchUpInside)
let settingsButton = UIBarButtonItem(customView: profileImageButton)

在大多数设备上,视图具有 40x40 的框架。但是,当我 运行 它放在 iPhone 6s 上时,它看起来有点长方形。所以我在 Xcode 的调试层次结构功能中打印出它的框架。我得到的结果是:frame = (0 0; 50 44),我假设这意味着框架的尺寸为 50x44。因此,我的问题是为什么 iPhone 6s 不保持指定的 40x40 大小?

在 iOS11 中,具有自定义视图的 UIBarButtonItem 的大小由自定义视图的内部约束 决定。你没有提供任何内部约束,所以所有的赌注都没有了;您还没有让自己负责栏按钮项目的大小。为此,给 profileImageButton 一个宽度约束和一个高度约束。

添加到 matt 的答案中,我还需要添加这三行代码以用于 iOS 11:

profileImageButton.translatesAutoresizingMaskIntoConstraints = false
profileImageButton.heightAnchor.constraint(equalToConstant: 40).isActive = true
profileImageButton.widthAnchor.constraint(equalToConstant: 40).isActive = true