web-dev-qa-db-ja.com

SwiftでUIBarButtonItemのフレームを取得しますか?

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エフェクトで移動することです。

ありがとう

18
Paul

次のように試してください:

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
33
Christian

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

これには、customViewで作成されたUIBarButtonItemオブジェクトを使用する必要があります。通常の方法で作成されたUIBarButtonItemオブジェクトは、十分な情報が公開されていません。フレームを検索することが重要ですafter親UINavigationControllerのUINavigationBarがサブビューツリー全体を完全にレイアウトしました。ほとんどのユースケースでは、表示されているUIViewControllerのviewDidAppearは、これを十分に近似したものです。

3
Dan Stenmark