web-dev-qa-db-fra.com

Obtenez le cadre de UIBarButtonItem dans Swift?

comment pourrais-je obtenir le cadre d'un droitbarbuttonItem en rapide? J'ai trouvé ceci: IBarButtonItem: Comment puis-je trouver son cadre? mais il dit ne peut pas convertir NSString en UIView, ou ne peut pas convertir NSString en chaîne:

let str : NSString = "view" //or type String
let theView : UIView = self.navigationItem.rightBarButtonItem!.valueForKey("view")//or 'str'

Le but est de supprimer le rightBarButtonItem, d'ajouter une imageView à la place et de la déplacer avec un effet fadeOut.

Merci

18
Paul

Vous devriez l'essayer comme:

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

var buttonItemSize = buttonItemView?.size

Modifier (Swift 3):

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

Dans 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)
                }
            }
        }
    }
4
ePing Tu
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))
    }
}

Vous devez utiliser des objets UIBarButtonItem créés avec customView pour cela; Les objets UIBarButtonItem créés de manière régulière n'ont pas suffisamment d'informations exposées. Il est important que la trame soit recherchée après le parent UINavigationController UINavigationBar a complètement présenté tout son arbre de sous-vue. Pour la plupart des cas d'utilisation, le viewDidAppear visible de UIViewController en est une assez bonne approximation.

3
Dan Stenmark