Get the frame of UIBarButtonItem in Swift? Get the frame of UIBarButtonItem in Swift? swift swift

Get the frame of UIBarButtonItem in Swift?


You should try it like:

var barButtonItem = self.navigationItem.rightBarButtonItem!var buttonItemView = barButtonItem.valueForKey("view")var buttonItemSize = buttonItemView?.size

Edit (Swift 3):

var barButtonItem = self.navigationItem.rightBarButtonItem!let buttonItemView = barButtonItem.value(forKey: "view") as? UIViewvar buttonItemSize = buttonItemView?.size


In Swift4, XCode9

    for view in (self.navigationController?.navigationBar.subviews)! {        if let findClass = NSClassFromString("_UINavigationBarContentView") {            if view.isKind(of: findClass) {                if let barView = self.navigationItem.rightBarButtonItem?.value(forKey: "view") as? UIView {                    let barFrame = barView.frame                    let rect = barView.convert(barFrame, to: view)                }            }        }    }


import UIKitclass ViewController: UIViewController {    let customButton = UIButton(type: .system)    override func viewDidLoad() {        super.viewDidLoad()        customButton.setImage(UIImage(named: "myImage"), for: .normal)        self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: customButton)    }    override func viewDidAppear(_ animated: Bool) {        super.viewDidAppear(animated)        print(self.customButton.convert(self.customButton.frame, to: nil))    }}

You must use UIBarButtonItem objects created with customView for this; UIBarButtonItem objects created the regular way don't have enough information exposed. It's important that the frame be looked up after the parent UINavigationController's UINavigationBar has completely laid out its entire subview tree. For most use cases, the visible UIViewController's viewDidAppear is a good enough approximation of this.