rightbarbuttonItemのフレームをすばやく取得するにはどうすればよいですか?私はこれを見つけました: IBarButtonItem:どうすればそのフレームを見つけることができますか? しかし、NSStringをUIViewに変換できない、またはNSStringをStringに変換できないと表示されています。
let str : NSString = "view" //or type String
let theView : UIView = self.navigationItem.rightBarButtonItem!.valueForKey("view")//or 'str'
目的は、rightBarButtonItemを削除し、代わりにimageViewを追加して、fadeOutエフェクトで移動することです。
ありがとう
次のように試してください:
var barButtonItem = self.navigationItem.rightBarButtonItem!
var buttonItemView = barButtonItem.valueForKey("view")
var buttonItemSize = buttonItemView?.size
編集(Swift 3):
var barButtonItem = self.navigationItem.rightBarButtonItem!
let buttonItemView = barButtonItem.value(forKey: "view") as? UIView
var buttonItemSize = buttonItemView?.size
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 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))
}
}
これには、customView
で作成されたUIBarButtonItemオブジェクトを使用する必要があります。通常の方法で作成されたUIBarButtonItemオブジェクトは、十分な情報が公開されていません。フレームを検索することが重要ですafter親UINavigationControllerのUINavigationBarがサブビューツリー全体を完全にレイアウトしました。ほとんどのユースケースでは、表示されているUIViewControllerのviewDidAppear
は、これを十分に近似したものです。