Get the frame of UIBarButtonItem in Swift?

后端 未结 3 1760
长情又很酷
长情又很酷 2020-12-06 09:44

how could I get the frame of a rightbarbuttonItem in swift? I found this : UIBarButtonItem: How can I find its frame? but it says cannot convert NSString to UIView, or canno

相关标签:
3条回答
  • 2020-12-06 10:23

    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? UIView
    var buttonItemSize = buttonItemView?.size
    
    0 讨论(0)
  • 2020-12-06 10:27

    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)
                    }
                }
            }
        }
    
    0 讨论(0)
  • 2020-12-06 10:27
    import UIKit
    
    class 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.

    0 讨论(0)
提交回复
热议问题