无法将图像(个人资料图片)按钮添加到 UINavigationBar
Unable to add image (profile picture) button to UINavigationBar
我正在尝试让我的 UINavigationBar
在左上角显示圆形个人资料图片。我可以使用以下实例化轻松显示 images/icons。
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: icon, style: .plain, target: self, action: #selector(funcToCall))
问题是,当尝试使用个人资料图片时,自定义视图和图像实例化都不会产生预期的结果。
尝试 1 -- Swift 4(图像实例化)
let img = originalImage.withRenderingMode(.alwaysOriginal)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: img, style: .plain, target: self, action: #selector(goToProfile))
这次尝试产生了
following result.
问题:
- 即使我指定了
leftBarButtonItem
,它也显示在中间
- 我无法使用此策略生成圆形按钮,因为没有可更改
cornerRadius
的视图。
尝试 2 -- Swift 4(自定义视图)
let idealButton = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
idealButton.setImage(imgToUse, for: .normal)
idealButton.imageView?.contentMode = .scaleAspectFill
idealButton.imageView?.layer.cornerRadius = 0.5 * idealButton.frame.width
idealButton.imageView?.layer.borderWidth = 0.75
idealButton.imageView?.layer.borderColor = rgba(240,240,240,1).cgColor
idealButton.addTarget(self, action: #selector(goToProfile), for: .touchUpInside)
navigationItem.setLeftBarButton(UIBarButtonItem(customView: idealButton), animated: false)
这次尝试产生了 following result。
问题
- 图像跨越整个
UINavigationBar
。它不受指定尺寸的限制。
非常感谢任何帮助。谢谢!
让我们尝试将 UIButton
添加为 UINavigationBar
的子视图
因此,从创建按钮并设置其属性开始(您可以在全局范围内使用 lazy
变量)
lazy var idealButton: UIButton = {
let button = UIButton()
button.setImage(imgToUse, for: .normal)
button.imageView?.layer.cornerRadius = 16
... // set other button's properties (border, target, colors, etc.)
return button
}()
现在将此按钮添加为当前 navigationController
的 navigationBar
的子视图
guard let navigationBar = navigationController?.navigationBar else { return }
navigationBar.addSubview(idealButton)
然后只需为您的按钮设置约束(您需要根据需要设置高度和宽度,左侧和底部约束等于 navigationBar
的约束)
idealButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
idealButton.leftAnchor.constraint(equalTo: navigationBar.leftAnchor, constant: 20),
idealButton.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -6),
idealButton.heightAnchor.constraint(equalToConstant: 32),
idealButton.widthAnchor.constraint(equalToConstant: 32)
])
我正在尝试让我的 UINavigationBar
在左上角显示圆形个人资料图片。我可以使用以下实例化轻松显示 images/icons。
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: icon, style: .plain, target: self, action: #selector(funcToCall))
问题是,当尝试使用个人资料图片时,自定义视图和图像实例化都不会产生预期的结果。
尝试 1 -- Swift 4(图像实例化)
let img = originalImage.withRenderingMode(.alwaysOriginal)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(image: img, style: .plain, target: self, action: #selector(goToProfile))
这次尝试产生了 following result.
问题:
- 即使我指定了
leftBarButtonItem
,它也显示在中间 - 我无法使用此策略生成圆形按钮,因为没有可更改
cornerRadius
的视图。
尝试 2 -- Swift 4(自定义视图)
let idealButton = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
idealButton.setImage(imgToUse, for: .normal)
idealButton.imageView?.contentMode = .scaleAspectFill
idealButton.imageView?.layer.cornerRadius = 0.5 * idealButton.frame.width
idealButton.imageView?.layer.borderWidth = 0.75
idealButton.imageView?.layer.borderColor = rgba(240,240,240,1).cgColor
idealButton.addTarget(self, action: #selector(goToProfile), for: .touchUpInside)
navigationItem.setLeftBarButton(UIBarButtonItem(customView: idealButton), animated: false)
这次尝试产生了 following result。
问题
- 图像跨越整个
UINavigationBar
。它不受指定尺寸的限制。
非常感谢任何帮助。谢谢!
让我们尝试将 UIButton
添加为 UINavigationBar
因此,从创建按钮并设置其属性开始(您可以在全局范围内使用 lazy
变量)
lazy var idealButton: UIButton = {
let button = UIButton()
button.setImage(imgToUse, for: .normal)
button.imageView?.layer.cornerRadius = 16
... // set other button's properties (border, target, colors, etc.)
return button
}()
现在将此按钮添加为当前 navigationController
的 navigationBar
guard let navigationBar = navigationController?.navigationBar else { return }
navigationBar.addSubview(idealButton)
然后只需为您的按钮设置约束(您需要根据需要设置高度和宽度,左侧和底部约束等于 navigationBar
的约束)
idealButton.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
idealButton.leftAnchor.constraint(equalTo: navigationBar.leftAnchor, constant: 20),
idealButton.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -6),
idealButton.heightAnchor.constraint(equalToConstant: 32),
idealButton.widthAnchor.constraint(equalToConstant: 32)
])