呼ばれない Cocoa TouchでNavigationBarとUIBarButtonItem要素の高さを変更する




uinavigationbar 高さ 変更 (5)

UINavigationbarの場合

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

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

UIBarButtonItemsについて
私は実際に自分自身を実行して、私が思いつくことができる唯一の事は、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で行った別の素晴らしいことは、ボタンとアクティビティインジケータのような他のものをツールバーに渡すことです。 お役に立てれば。

Appleのガイドラインに厳密には合致していないと思うが、どうにかしてそれが可能でなければならないと思う。 UINavigationController内のナビゲーションバーの高さとそのバー内のUIBarButtonItem要素の高さを変更したいと思います。

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

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


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アプリでは、固定された横向きの向きがあり、サイズの幅をハードコードする必要があることがわかりました


どれくらいひどくこれが欲しいですか? そして、どのように薄く(または厚く)ナビバーを作りたいですか?

1つのアプローチは、ナビゲーションバーの変換をスケールして変換することです。 あなたがそれをあまりにも拡大縮小した場合、タイトルとボタンのテキストはぎこちないように見えますが、数ピクセルだけを削る必要があれば、あなたは大丈夫かもしれません。

フルサイズ(高さ33ピクセル)の75%になるようスケーリングした結果は次のとおりです。

そしてこれを作り出したコード:

- (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を使用して、navbarとビューコントローラビューのサイズと位置を決めるのと戦っているということです。 この手法を使用するビューコントローラ間でアニメーションを作成すると、奇妙に見える可能性があります。

あなたが関連する問題を解決できるかどうか不思議に思います...

最後に考えたこと: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

私はUINavigationBarをサブクラス化し、 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をサブクラスUINavigationBarする方法を知る必要がある場合は、 この非常に良い答えを見てください。

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


これが私の解決です。 それはとてもうまくいく。

@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;
    }
}




uibarbuttonitem