UIBarButtonItem:我怎样才能找到它的框架?

tot*_*ian 61 objective-c ios swift

我在工具栏中有一个按钮.我怎么能抓住它的框架?难道UIBarButtonItem不是有一个frame属性?

Ano*_*dya 89

试试这个;

UIBarButtonItem *item = ... ;
UIView *view = [item valueForKey:@"view"];
CGFloat width;
if(view){
    width=[view frame].size.width;
}
else{
    width=(CGFloat)0.0 ;
}
Run Code Online (Sandbox Code Playgroud)

  • "没有Appstore安全的定义".该陈述无效.使用私有API不是"Appstore safe".期 (21认同)
  • 没有"Appstore safe"的定义.你的程序没有崩溃,你不是黑客攻击,你不会使苹果不想要的任何东西失效然后罚款.很多时候应用程序因为奇怪的原因而被拒绝. (6认同)
  • 好的,我之前看到[item valueForKey:@"view"]正在使用未记录的API方法... (3认同)

Mob*_*Mon 19

这种方式最适合我:

UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)];
CGRect rect = targetView.frame;
Run Code Online (Sandbox Code Playgroud)


tot*_*ian 12

感谢Anoop Vaidya的建议答案.另一种方法是(让您知道工具栏中按钮的位置)

UIView *view= (UIView *)[self.toolbar.subviews objectAtIndex:0]; // 0 for the first item


CGRect viewframe = view.frame;
Run Code Online (Sandbox Code Playgroud)


Luc*_*nzo 10

使用Swift,如果你需要经常使用条形按钮项,你应该实现这样的扩展:

extension UIBarButtonItem {

    var frame: CGRect? {
        guard let view = self.value(forKey: "view") as? UIView else {
            return nil
        }
        return view.frame
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,您可以轻松访问:

if let frame = self.navigationItem.rightBarButtonItems?.first?.frame {
    // do whatever with frame            
}
Run Code Online (Sandbox Code Playgroud)


Dan*_*ark 10

Oof,在这个帖子中有很多粗略的答案.这是正确的方法:

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))
    }
}
Run Code Online (Sandbox Code Playgroud)


jda*_*day 5

这是我在 iOS 11 和 Swift 4 中使用的。没有可选的它可能会更干净一些,但我很安全:

extension UIBarButtonItem {
    var view: UIView? {
        return perform(#selector(getter: UIViewController.view)).takeRetainedValue() as? UIView
    }
}
Run Code Online (Sandbox Code Playgroud)

和用法:

if let barButtonFrame = myBarButtonItem.view?.frame {
    // etc...
}
Run Code Online (Sandbox Code Playgroud)