web-dev-qa-db-ja.com

CocoaTouchでナビゲーションバーとその中のUIBarButtonItem要素の高さを変更します

Appleガイドラインに厳密に準拠していないと思いますが、どういうわけか可能であるに違いないと思います。UINavigationController内のナビゲーションバーの高さとそのバー内のUIBarButtonItem要素の高さを変更したいと思います。 。

この質問 のトリックを使用して、ナビゲーションバーの高さを変更できましたが、バーボタンアイテムの高さを調整する方法がわかりません。

バーボタンアイテムのサイズを変更する方法を知っている人がいたら、私を助けてください。

19
mgamer

これが私の解決策です。それは非常にうまく機能します。

@interface UINavigationBar (CustomHeight)

@end

@implementation UINavigationBar (CustomHeight)

- (CGSize)sizeThatFits:(CGSize)size {
    // Change navigation bar height. The height must be even, otherwise there will be a white line above the navigation bar.
    CGSize newSize = CGSizeMake(self.frame.size.width, 40);
    return newSize;
}

-(void)layoutSubviews {
    [super layoutSubviews];

    // Make items on navigation bar vertically centered.
    int i = 0;
    for (UIView *view in self.subviews) {
        NSLog(@"%i. %@", i, [view description]);
        i++;
        if (i == 0)
            continue;
        float centerY = self.bounds.size.height / 2.0f;
        CGPoint center = view.center;
        center.y = centerY;
        view.center = center;
    }
}
18
Vince Yuan
static CGFloat const CustomNavigationBarHeight = 74;


@implementation WTNavigationBar



- (CGSize)sizeThatFits:(CGSize)size{
    size.width = 1024;
    size.height = CustomNavigationBarHeight;
    return size;
}

-(void)layoutSubviews {
    [super layoutSubviews];
    for (UIView *view in self.subviews) {
        SFLog(@"view.class=%@",[view class]);
        if ([view isKindOfClass:NSClassFromString(@"UINavigationItemButtonView")]) {
            float centerY = self.bounds.size.height / 2.0f;
            CGPoint center = view.center;
            center.y = centerY;
            view.center = center;
        }
    }
}


@end

横向きが固定されているiPadアプリで、サイズの幅をハードコーディングする必要があることがわかりました

4
Jagie

INavigationbarの場合

IOS SDK 4.3以降では、UINavigationBarの高さを変更する方法(ハック)があります。

UINavigationControllerの高さを変更するには、viewWillAppear:animated:関数でフレームサイズを変更します。その後、高さはアプリ全体でカスタマイズされたままになります。

IBarButtonItemsの場合
私は実際にこれに遭遇しました。私が思いついたのは、initWithCustomViewを活用し、定義されたフレームでUIButtonを渡すことだけでした。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];

/*
* Insert button styling
*/

button.frame = CGRectMake(0, 0, width, height);

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

それ以外の場合、UIBarButtonItemには設定可能なwidthプロパティのみがありますが、残念ながらheightプロパティはありません。私がinitWithCustomViewで行ったもう一つの気の利いたことは、ボタンやアクティビティインジケーターのような他のものを備えたツールバーを渡すことです。お役に立てれば。

3
SimplyKiwi

UINavigationBarをサブクラス化し、-layoutSubviewsをオーバーライドすることで、なんとか似たようなことをすることができました。コードは次のようになります。

-(void)layoutSubviews {
    [super layoutSubviews];
    int i = 0;
    for (UIView *view in self.subviews) {
        NSLog(@"%i. %@", i++, [view description]);
        if ([view isKindOfClass:NSClassFromString(@"UINavigationButton")]) {
            view.frame = CGRectMake(0, 0, 100, 50);
        }
    }
}

UINavigationBarをサブクラス化する方法を知る必要がある場合は、 この非常に良い答え を見てください。

NSClassFromString(@ "UINavigationButton")]の部分についてはよくわかりません。それは動作しますが、私はこれを実験として行いました。これがAppleによって承認されるかどうかはわかりません。より良い知識を持った人が光を当ててくれることを願っています。

3
phi

これはどれほどひどく欲しいですか?そして、ナビゲーションバーをどのくらい薄く(または厚く)したいですか?

1つのアプローチは、ナビゲーションバーの変換を設定してスケーリングおよび変換することです。拡大縮小しすぎると、タイトルとボタンのテキストが不安定に見えますが、数ピクセルだけ削る必要がある場合は、問題ない可能性があります。

これは、全高の75%(高さ33ピクセル)にスケーリングした結果です。

enter image description here

そしてこれを生み出したコード:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationItem.title = @"Thin Navigation Bar";

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle: @"Press Me" style:UIBarButtonItemStyleBordered target: nil action: NULL ] autorelease];

    CGFloat scale = .75;
    CGFloat cy = 44.0 - ( 44.0 * scale );

    self.navigationController.navigationBar.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale )  ;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGFloat scale = .75;
    CGFloat cy = 44.0 - ( 44.0 * scale );

    CGRect r = self.view.frame;
    r.Origin.y -= cy;
    r.size.height += cy;
    self.view.frame = r;
}

さて、これには多くの問題があり、解決できる場合とできない場合があります。 #1は、UINavigationControllerを使用して、ナビゲーションバーとビューコントローラービューのサイズと位置を調整していることです。この手法を使用するViewController間のアニメーションは、奇妙に見える可能性があります。

関連する問題を解決していただければと思います...

最後に考えたのは、UINavigationControllerを使用しない場合は、押しつぶされたテキスト以外に、これに関する問題はそれほど多くないということです。または、ナビゲーションコントローラーを使用して、デフォルトのナビゲーションバーを非表示にし、子ビューコントローラーの各ビューに細いナビゲーションバーを追加することもできます。 UINavigationBarをサブクラス化し、以下から変換を設定することもできます。

@interface TSThinNavBar : UINavigationBar
{
}
@end

@implementation TSThinNavBar

// assuming we'll always be constructed from a nib
- (id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder: aDecoder];
    if ( self != nil ) 
    {
        CGFloat scale = .75;
        CGFloat cy = 44.0 - ( 44.0 * scale );

        self.transform = CGAffineTransformScale( CGAffineTransformMakeTranslation( 0, -cy / 2.0 ), 1.0, scale )  ;
    }

    return self;
}

@end
2
TomSwift