31

カスタムの左右のUINavigationBarアイテムの左右に水平パディングを削除するにはどうすればよいですか? iOSがデフォルトで設定する10ポイントのパディングがあるようです。デフォルトの水平パディングなしでナビゲーションバーにUIBarButtonItemベースのカスタムビューを配置する

私は左と右のナビゲーションバーボタンをカスタマイズしています(私は自分のbackButtonItemを設定しようとしたので、私はleftBarButtonItemを使用しています)。

これらのカスタムボタンを押すと、AppleはleftBarButtonItemの左側とrightBarButtonItemの右側にいくつかのパディングを保存しているように見えます。 UIButtonのカスタム・バックグラウンドとイメージ・プロパティをどれだけ広げても、カスタム・ビューとして左/右のボタン・アイテム内に配置されます。

UIBarButtonItemsにはアクセスできる「フレーム」がないため、通常のUIViewと同様にスーパービュー内に配置することはできません。

このデフォルトパディングを削除する方法についてのご意見はありますか?私がゼロ幅に縮小しようとしているビットを参照するには、添付のスクリーンショットを参照してください。スクリーンショットでは、プラスアイコンは右にシフトして表示されています。強調表示された背景画像は、おそらくその挿入図を使用して、右側にクリップされています)。で

参照イメージ:参考https://skitch.com/starbaseweb/rj2e5/ios-simulator

、ここでは(この場合には、それは右のボタンです)私は私のカスタムUIBarButtonItemを作成しています方法は次のとおりです。

- (UIBarButtonItem *)customAddButtonItemWithTarget:(id)target action:(SEL)action { 
    UIButton *customButtonView = [UIButton buttonWithType:UIButtonTypeCustom]; 

    customButtonView.frame = CGRectMake(0.0f, 0.0f, 45.0f, 44.0f); 

    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setBackgroundImage: 
     [UIImage imageNamed:@"bgNavBarButton-OutsideRight-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Normal.png"] 
     forState:UIControlStateNormal]; 
    [customButtonView setImage: 
     [UIImage imageNamed:@"bgNavBarButton-Add-Highlighted.png"] 
     forState:UIControlStateHighlighted]; 

    [customButtonView addTarget:target action:action 
     forControlEvents:UIControlEventTouchUpInside]; 

    UIBarButtonItem *customButtonItem = [[[UIBarButtonItem alloc] 
     initWithCustomView:customButtonView] autorelease]; 
    [customButtonView setImageEdgeInsets:UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f)]; 

    //customButtonItem.imageInsets = UIEdgeInsetsMake(0.0f, 10.0f, 0.0f, 0.0f); 

    return customButtonItem;  
} 
+0

+1:私はこの問題を抱えていて、インセットを含めて、x位置などで-10で画像を作ってみました。運がよかったので、ちょっとしたパディングとレッドそれをより適切にするためのイメージ。がんばろう。 –

答えて

82

55私が行った解決策は、この回答に基づいていますが、非常に多くの関連する質問には、How to adjust UIToolBar left and right paddingです。また、iOS5によって容易になります(そして依存しています)。これにより、1つではなく、複数のボタンを左右に設定することができます。ここで

は、カスタム左ボタン項目の左側にパディングを除去する例を示します

UIBarButtonItem *backButtonItem // Assume this exists, filled with our custom view 

// Create a negative spacer to go to the left of our custom back button, 
// and pull it right to the edge: 
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc] 
    initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace 
    target:nil action:nil]; 
negativeSpacer.width = -5; 
// Note: We use 5 above b/c that's how many pixels of padding iOS seems to add 

// Add the two buttons together on the left: 
self.navigationItem.leftBarButtonItems = [NSArray 
    arrayWithObjects:negativeSpacer, backButtonItem, nil]; 

そして、これで、ナビゲーションバーの左側のバーボタン項目の左パディング、消えました!

注::これはiOS5とiOS6でうまくいきました。 iOS7が公開されているデモとはかなり異なっていることを考えると、iOS7の初期のシードを持つユーザーは、このような意図しないものがiOS6を超えて実際に引き続き動作するかどうかをテストする必要があります。

+7

orderを変更せずにrightBarButtonItemsにも機能します(backButtonItemとnegativeSpaceの順序を逆にしたくなるかもしれませんが、そうではありません) – Martin

+0

ありがとうございます! – chourobin

+0

本当にこの男のおかげで! :) –

3

私はこれを試してみました、それが動作します:

1)-drawRect:は何も行わず、不透明ではなく、backgroundColor = [UIColor clearColor]のカスタムUIToolbarサブクラスを作成します。

2)ツールバーをカスタム表示としてカスタムUIBarButtonItemを作成します。

3)カスタムツールバーにボタンを追加します。

4)カスタムツールバーで-layoutSubviewsを上書きして、独自の間隔を設定します。

+0

別のトリックは、ナビゲーションバーをビューポートよりも幅広くするだけで、正しいパディングが切り取られ、ボタンが正しい場所に表示されることです。これは、UINavigationBarを直接管理する場合、つまりナビゲーションコントローラを使用しない場合にのみ機能します。 –

+0

エバドネありがとう。私は回避策でこれを先に進めましたが、私はこのポストリリースに戻ってあなたの提案した回避策を確認し、それを受け入れられた回答としてマークすることができます。 – idStar

+0

私はより洗練された実装を見つけました。これはiOS5でも可能です。ここでの答えを参照してください:http://stackoverflow.com/questions/6021138/how-to-adjust-uitoolbar-left-and-right-padding/7042201#7042201私はこのソリューションをテストし、うまくいきました。 2行のコードと最小の侵入。 – idStar

関連する問題