无法获取 navigationItem.rightBarButtonItem 的 UIView/Frame - iOS

Posted

技术标签:

【中文标题】无法获取 navigationItem.rightBarButtonItem 的 UIView/Frame - iOS【英文标题】:Unable to get UIView/Frame of navigationItem.rightBarButtonItem - iOS 【发布时间】:2019-12-10 06:46:16 【问题描述】:

我在 Swift 5 中的应用程序在右上角显示了一个导航项,使用

override public func viewDidLoad() 
    super.viewDidLoad()
    var deleteNavBarItem = UIBarButtonItem.init(barButtonSystemItem:.trash, target: self, action: #selector(deleteButtonOnClick))
    navigationItem.rightBarButtonItem = deleteNavBarItem

    ...

由于一些需求,我们想根据导航栏项目的位置显示一些自定义的子视图。

因此我想获得整个视图的这个rightBarButtonItem 的相对位置/frame

我已经尝试通过论坛提供的一些答案来使用下面的代码。

let view1 = navigationItem.rightBarButtonItem?.value(forKeyPath: "view") as? UIView
let view2 = deleteNavBarItem.value(forKey: "view") as? UIView

但是 view1view2 都返回 nil。

是否有任何替代解决方案可以找到rightBarButtonItemframe/UIView

请多多指教。

【问题讨论】:

您调用此代码的位置 【参考方案1】:

创建一个条形按钮插座并使用以下代码获取框架

class ViewController: UIViewController 

    @IBOutlet weak var rightBarButton: UIBarButtonItem!
    override func viewDidLoad() 
        super.viewDidLoad()

        if let barButtonFrame = rightBarButton.perform(#selector(getter: UIViewController.view)).takeRetainedValue().frame 
            print(barButtonFrame) // prints (0.0, 0.0, 42.0, 44.0)

        
    

【讨论】:

【参考方案2】:

您可以使用UIView/UIButton创建自定义栏按钮并在rightBarButtonItem中添加按钮。

let button = UIButton(type: UIButton.ButtonType.custom)
button.setImage(UIImage(named: "getstarted"), for: .normal)
button.addTarget(self, action:#selector(callMethod), for: .touchUpInside)
button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
let barButton = UIBarButtonItem(customView: button)
navigationItem.rightBarButtonItem = [barButton]

【讨论】:

以上是关于无法获取 navigationItem.rightBarButtonItem 的 UIView/Frame - iOS的主要内容,如果未能解决你的问题,请参考以下文章

错误:您所请求的网址(URL)无法获取 怎么搞的?

无法使用 StorageClass 配置卷 - 无法获取存储帐户的存储密钥

无法在VSTS版本中获取Azure Vault密钥 - 无法获取JWT

怎么解决电脑无法自动获取IP地址呢?

"您所请求的网址(URL)无法获取"怎么解决

为啥Android有时无法获取位置