Appleガイドラインに厳密に準拠していないと思いますが、どういうわけか可能であるに違いないと思います。UINavigationController内のナビゲーションバーの高さとそのバー内のUIBarButtonItem要素の高さを変更したいと思います。 。
この質問 のトリックを使用して、ナビゲーションバーの高さを変更できましたが、バーボタンアイテムの高さを調整する方法がわかりません。
バーボタンアイテムのサイズを変更する方法を知っている人がいたら、私を助けてください。
これが私の解決策です。それは非常にうまく機能します。
@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;
}
}
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アプリで、サイズの幅をハードコーディングする必要があることがわかりました
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で行ったもう一つの気の利いたことは、ボタンやアクティビティインジケーターのような他のものを備えたツールバーを渡すことです。お役に立てれば。
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によって承認されるかどうかはわかりません。より良い知識を持った人が光を当ててくれることを願っています。
これはどれほどひどく欲しいですか?そして、ナビゲーションバーをどのくらい薄く(または厚く)したいですか?
1つのアプローチは、ナビゲーションバーの変換を設定してスケーリングおよび変換することです。拡大縮小しすぎると、タイトルとボタンのテキストが不安定に見えますが、数ピクセルだけ削る必要がある場合は、問題ない可能性があります。
これは、全高の75%(高さ33ピクセル)にスケーリングした結果です。
そしてこれを生み出したコード:
- (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