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ピクセルの幅に調整するにはどうすればよいですか。
あなたが検討するかもしれない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;
現在、これは、UIBarButtonItem
のUINavigationController
に追加されるnavigationItem
sの自動サイズ制限を制限する唯一の方法です。
これを行うには、インターフェイスビルダーからバーボタンアイテムに画像をドロップし、次のコードでカスタムビューの幅を変更します。
CGRect frame = self.navigationItem.leftBarButtonItem.customView.frame;
frame.size.width = 141;
self.navigationItem.leftBarButtonItem.customView.frame = frame;
これで重要なことは、UIBarButton
自体ではなく、カスタムビューの幅を変更していることを認識することです。
したがって、コードは次のとおりです。
CGRect resizedFrame = myBarButtonItem.customView.frame;
resizedFrame.size.width = myNewWidth;
myBarButtonItem.customView.frame = resizedFrame;
また、レイアウトの変更をトリガーする必要があります。
[myNavigationBar setNeedsLayout];
これはすべて、レイアウトが自動サイズ調整とフレームで行われていることは言うまでもありません。自動レイアウトを使用したナビゲーションバーへの侵入は成功しませんでした。私の質問を参照してください INavigationBarとUIBarButtonItemを使用した自動レイアウト 。
申し訳ありませんが、私のコードは@oscartzombieとほとんど同じであることがわかりました。意図的ではありません! Interface Bulderや画像を特に参照せずに説明することに加えて、レイアウトやその他のポイントを追加する価値があると思うので、この回答を残します。
次のアプローチが機能しました。ボタンの幅と高さを変更し、アクション項目も追加するコードを参照してください。
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のターゲットとアクションは画像ビューには適用されません
これらのソリューションはどれも私にとってはうまくいきませんでしたし、自動サイズ変更がコードで書いた次元を上書きすることがわかりました。
uIButtonの方法でボタンを作成した後、次のコードブロックを記述します。
[self.navigationItem.rightBarButtonItem.customView.widthAnchor constraintEqualToConstant:mWidth].active = YES;
[self.navigationItem.rightBarButtonItem.customView.heightAnchor constraintEqualToConstant:mHeight].active = YES;