2015-03-11 4 views
9

как я могу получить рамку правой панели в строке? Я нашел это: UIBarButtonItem: How can I find its frame?, но говорит, что не может преобразовать NSString в UIView, или не может преобразовать NSString в строку:Получите кадр UIBarButtonItem в Swift?

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

Цель состоит в том, чтобы удалить rightBarButtonItem, добавить ImageView вместо этого, и переместить его с эффектом FADEOUT.

Благодаря

ответ

26

Вы должны попробовать это нравится:

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

отличное спасибо, с 'AnyObject?' To buttonItemView работает нормально – Paul

+2

не работает с новыми SDK и Xcode 8.3.1 Есть ли у вас альтернатива? – JVS

+0

@JVS '.valueForKey' возвращает Any ?. Перейдите в UIView, чтобы скомпилировать его. 'var buttonItemSize = (buttonItemView as? UIView) .size' –

1

В 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

Это не сработало для меня. Swift 4 XCode 9 – Aerox

+0

@Aerox попробуйте вызвать этот метод viewDidAppear() – Hosny

+0

@Aerox, вы также можете попробовать называть это в 'viewDidLayoutSubviews', но вы должны быть осторожны, чтобы не называть его больше, что его нужно вызвать. – 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)) 
    } 
} 

Для этого необходимо использовать объекты UIBarButtonItem, созданные с помощью customView; Объекты UIBarButtonItem, созданные обычным способом, не имеют достаточной информации. Важно, чтобы рамка выглядела после родительский UINavigationBar UINavigationController полностью выложил все его дерево подвид. Для большинства случаев использования видимый UIViewController viewDidAppear является достаточно хорошим приближением.

Смежные вопросы