70

ツールバーにボタンがあります。どうすればそのフレームをつかむことができますか?プロパティがありませUIBarButtonItemんか?frame

4

15 に答える 15

94

これを試してください。

UIBarButtonItem *item = ... ;
UIView *view = [item valueForKey:@"view"];
CGFloat width;
if(view){
    width=[view frame].size.width;
}
else{
    width=(CGFloat)0.0 ;
}
于 2013-01-14T12:29:07.050 に答える
20

この方法は私にとって最適です:

UIView *targetView = (UIView *)[yourBarButton performSelector:@selector(view)];
CGRect rect = targetView.frame;
于 2013-08-20T21:01:26.157 に答える
16

Swiftでは、バーボタンアイテムを頻繁に操作する必要がある場合は、次のような拡張機能を実装する必要があります。

extension UIBarButtonItem {

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

}

次に、コードで簡単にアクセスできます。

if let frame = self.navigationItem.rightBarButtonItems?.first?.frame {
    // do whatever with frame            
}
于 2017-07-28T12:49:40.457 に答える
15

ああ、このスレッドには大まかな答えがたくさんあります。これを行う正しい方法は次のとおりです。

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))
    }
}
于 2017-10-26T23:05:50.310 に答える
12

提案された答えをくれたAnoopVaidyaに感謝します。別の方法として、(ツールバーのボタンの位置がわかっている場合)

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


CGRect viewframe = view.frame;
于 2013-01-14T13:21:25.570 に答える
4

これが私がiOS11とSwift4で使用しているものです。オプションがないと少しきれいになるかもしれませんが、安全にプレイしています。

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

そして使用法:

if let barButtonFrame = myBarButtonItem.view?.frame {
    // etc...
}

編集:これを使用することはもうお勧めしません。ダンの答えのように、カスタムビューでUIBarButtonItemsを使用するように実装を変更することになりました

于 2018-08-31T22:16:19.427 に答える
3
-(CGRect) getBarItemRc :(UIBarButtonItem *)item{
    UIView *view = [item valueForKey:@"view"];
    return [view frame];
}
于 2015-01-13T07:21:07.337 に答える
1

UIButtonであるカスタムビューを使用してUIBarButtonItemを作成すると、必要な操作を実行できます。:]

于 2017-02-16T16:12:31.800 に答える
1

ヒューマンインターフェイスガイドラインlayoutMarginsのアイコンサイズガイドとframe組み合わせて、navigationBarのようなプロパティを使用して大まかに計算し、現在のデバイスの向きを考慮に入れることができます。

- (CGRect)rightBarButtonFrame {
    CGFloat imageWidth = 28.0;
    CGFloat imageHeight = UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeLeft || UIDevice.currentDevice.orientation == UIDeviceOrientationLandscapeRight ? 18.0 : 28.0;
    UIEdgeInsets navigationBarLayoutMargins = self.navigationController.navigationBar.layoutMargins;
    CGRect navigationBarFrame = self.navigationController.navigationBar.frame;
    return CGRectMake(navigationBarFrame.size.width-(navigationBarLayoutMargins.right + imageWidth), navigationBarFrame.origin.y + navigationBarLayoutMargins.top, imageWidth, imageHeight);
}
于 2019-03-19T17:52:20.923 に答える
0

この実装を試してください:

@implementation UIBarButtonItem(Extras)

- (CGRect)frameInView:(UIView *)v {

    UIView *theView = self.customView;
    if (!theView.superview && [self respondsToSelector:@selector(view)]) {
        theView = [self performSelector:@selector(view)];
    }

    UIView *parentView = theView.superview;
    NSArray *subviews = parentView.subviews;

    NSUInteger indexOfView = [subviews indexOfObject:theView];
    NSUInteger subviewCount = subviews.count;

    if (subviewCount > 0 && indexOfView != NSNotFound) {
        UIView *button = [parentView.subviews objectAtIndex:indexOfView];
        return [button convertRect:button.bounds toView:v];
    } else {
        return CGRectZero;
    }
}

@end
于 2013-05-24T11:40:09.910 に答える
0

サブビューをループして、サブビューのタイプまたは内容を確認して識別できるようにする必要があります。kvoでビューにアクセスするのは安全ではなく、インデックスについて確信が持てません。

于 2016-08-10T20:37:21.173 に答える
0

この回答を確認してください:UIBarButtonItemに境界線とコーナー半径を適用する方法は?これは、サブビューをループしてボタンのフレームを見つける方法を説明しています。

于 2016-10-06T09:47:16.657 に答える
0

Swift 4.2で、lucaに触発されました

extension UIBarButtonItem {

    var frame:CGRect?{
        return (value(forKey: "view") as? UIView)?.frame
    }

}


guard let frame = self.navigationItem.rightBarButtonItems?.first?.frame else{ return }
于 2018-11-28T14:39:46.640 に答える
0

ビューにタグが付いたバーボタンアイテムのビューを使用しました。

for view in bottomToolbar.subviews {
   if let stackView = view.subviews.filter({$0 is UIStackView}).first {
       //target view has tag = 88
       if let targetView = stackView.subviews.filter({$0.viewWithTag(88) != nil}).first {                                
          //do something with target view
   }
}

}

于 2020-06-02T22:11:58.197 に答える
-2

Swift 4 up現在の最善の方法は、次の場所からフレームにアクセスすることです。

self.navigationItem.rightBarButtonItems

let customView = navigationItem.rightBarButtonItems?.first?.customView // access the first added customView

この方法でアクセスする方が、プライベートAPIにアクセスするよりも安全です。

  • これで答えをチェックしてください:

CustomViewをnavigationItemに追加した後、CustomViewは常にnilを返します

于 2020-02-29T17:07:39.517 に答える