web-dev-qa-db-ja.com

UINavigationBarのUIBarButtonItemの幅を変更します

UIBarButtonItemを作成し、ナビゲーションバーに次のように追加しています。

(void)viewDidLoad { 

   ...

   // Add the refresh button to the navigation bar
   UIButton *refreshButton = [UIButton buttonWithType:UIButtonTypeCustom];
   [refreshButton setFrame:CGRectMake(0,0,30,30)];
   [refreshButton setImage:[UIImage imageNamed:@"G_refresh_icon.png"] forState:UIControlStateNormal];
   [refreshButton addTarget:self action:@selector(refreshData) forControlEvents:UIControlEventTouchUpInside];
   UIBarButtonItem *refreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:refreshButton] autorelease];
   self.navigationItem.leftBarButtonItem = refreshBarButton;
}

実行すると正しく表示されますが、ナビゲーションバーをx = 0から約100までの範囲でタップして、バーボタン項目を選択できます。選択可能な領域を30ピクセルの幅に調整するにはどうすればよいですか。

18
Darren

あなたが検討するかもしれない1つのアプローチは、initWithCustomView:を呼び出すことによってUIBarButtonItemを作成することです。これは、「選択された」状態がすぐに得られず、ボタン画像にボーダー付きの背景を合成する必要があるという点では理想的ではありませんが、それにより、より直接フレームを指定できますツールバー項目。画像の代わりにタイトルにテキストを使用している場合は、サブビューとして背景画像を追加する必要があります。とにかく、私は今同じ問題を抱えており、このコードは私のために機能します:

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"button-image.png"]];
imageView.frame = CGRectMake(0, 0, 43, 30);

UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageView];

self.navigationItem.leftBarButtonItem = barButtonItem;

現在、これは、UIBarButtonItemUINavigationControllerに追加されるnavigationItemsの自動サイズ制限を制限する唯一の方法です。

または マギーのソリューションを試してみてください。これは私よりも徹底的です

13
Aaron

これを行うには、インターフェイスビルダーからバーボタンアイテムに画像をドロップし、次のコードでカスタムビューの幅を変更します。

CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame;
frame.size.width = 141;
self.navigationItem.leftBarButtonItem.customView.frame = frame;
5
odm

これで重要なことは、UIBarButton自体ではなく、カスタムビューの幅を変更していることを認識することです。

したがって、コードは次のとおりです。

CGRect resizedFrame = myBarButtonItem.customView.frame;
resizedFrame.size.width = myNewWidth;
myBarButtonItem.customView.frame = resizedFrame;

また、レイアウトの変更をトリガーする必要があります。

[myNavigationBar setNeedsLayout];

これはすべて、レイアウトが自動サイズ調整とフレームで行われていることは言うまでもありません。自動レイアウトを使用したナビゲーションバーへの侵入は成功しませんでした。私の質問を参照してください INavigationBarとUIBarButtonItemを使用した自動レイアウト

申し訳ありませんが、私のコードは@oscartzombieとほとんど同じであることがわかりました。意図的ではありません! Interface Bulderや画像を特に参照せずに説明することに加えて、レイアウトやその他のポイントを追加する価値があると思うので、この回答を残します。

5
Max MacLeod

次のアプローチが機能しました。ボタンの幅と高さを変更し、アクション項目も追加するコードを参照してください。

UIButton *imageButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 22, 22)];
[imageButton setBackgroundImage:[UIImage imageNamed:@"message_button"] forState:UIControlStateNormal];
[imageButton addTarget:self action:@selector(messageButtonTapped) forControlEvents:UIControlEventAllEvents];
UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:imageButton];
self.navigationItem.leftBarButtonItem = leftBarButtonItem;

注:UIBarButtonItemのターゲットとアクションは画像ビューには適用されません

5
Abdullah Saeed

これらのソリューションはどれも私にとってはうまくいきませんでしたし、自動サイズ変更がコードで書いた次元を上書きすることがわかりました。

uIButtonの方法でボタンを作成した後、次のコードブロックを記述します。

[self.navigationItem.rightBarButtonItem.customView.widthAnchor constraintEqualToConstant:mWidth].active = YES;
[self.navigationItem.rightBarButtonItem.customView.heightAnchor constraintEqualToConstant:mHeight].active = YES;
2
ACAkgul