web-dev-qa-db-ja.com

カスタムビューベースのUIBarButtonItemをデフォルトの水平パディングなしのナビゲーションバーに配置する

カスタムの左と右のUINavigationBarアイテムの左右の水平パディングを削除するにはどうすればよいですか? iOSがデフォルトで設定する10ポイントのパディングがあるようです。

左と右のナビゲーションバーボタンをカスタマイズしています(自分の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;    
}
31
idStar

55上記でコメントしたように、私が行った解決策は、別の、しかし非常に関連する質問に対するこの回答に基づいています: IToolBarの左右のパディングを調整する方法 。また、iOS5によって促進され(依存します)、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を超えて機能し続けるかどうかをテストする必要があります。

83
idStar

私はこれを試しましたが、うまくいきます:

1)カスタムUIToolbarサブクラスを作成します。これは、-drawRect:では何もせず、不透明ではなく、backgroundColor = [UIColor clearColor]を持っています。

2)ツールバーをカスタムビューとして使用して、カスタムUIBarButtonItemを作成します。

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

4)カスタムツールバーで-layoutSubviewsをオーバーライドし、独自の間隔を設定します。

3
Evadne Wu