2015-03-11 8 views
9

Wie kann ich den Rahmen eines rightbarbuttonItem in swift bekommen? Ich fand dies: UIBarButtonItem: How can I find its frame? aber es sagt, kann NSString zu UIView nicht konvertieren oder nicht konvertieren kann NSString zu String:Erhalten Sie den Rahmen von UIBarButtonItem in Swift?

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

Das Ziel ist es, die rightBarButtonItem, fügen Sie einen Imageview statt, zu entfernen und es mit einem fadeOut Effekt zu bewegen.

Dank

Antwort

26

Sie sollten es mögen versuchen:

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

perfekt danke, mit einem 'AnyObject?' Zu buttonItemView funktioniert es gut – Paul

+2

funktioniert nicht mit dem neuen SDK und Xcode 8.3.1 Haben Sie eine Alternative? – JVS

+0

@JVS '.valueForKey' gibt ein Any? Cast zu UIView, um es kompilieren zu lassen. 'var buttonItemSize = (buttonItemView als? UIView) .size' –

1

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) 
       } 
      } 
     } 
    } 
+1

Das hat nicht für mich funktioniert. Swift 4 XCode 9 – Aerox

+0

@Aerox versuchen, dies in ViewDidAppear() -Methode – Hosny

+0

@Aerox aufrufen Sie können auch versuchen, dies in 'viewDidLayoutSubviews' aufrufen, aber Sie sollten vorsichtig sein, vermeiden Sie es mehr nennen, dass es aufgerufen werden muss. – ThomasW

0
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)) 
    } 
} 

Sie müssen dafür UIBarButtonItem-Objekte verwenden, die mit customView erstellt wurden; UIBarButtonItem-Objekte, die auf normale Weise erstellt wurden, verfügen nicht über genügend Informationen. Es ist wichtig, dass der Frame nachgeschlagen wird nach die UINavigationBar des übergeordneten UINavigationControllers hat seine gesamte Subview-Struktur vollständig ausgelegt. Für die meisten Anwendungsfälle ist der sichtbare UIViewController viewDidAppear eine gute Approximation davon.