ナビゲーション バーのタイトルとして画像を設定することはできますか?
NYTimesアプリはナビゲーションバーを使っていて、タイトルが画像ファイルのようになっていると思います(そう見えるのUINavigationBar
は検索に右ボタンを使っているからです)。
ナビゲーション バーのタイトルとして画像を設定することはできますか?
NYTimesアプリはナビゲーションバーを使っていて、タイトルが画像ファイルのようになっていると思います(そう見えるのUINavigationBar
は検索に右ボタンを使っているからです)。
次のようUIImageView
に、プロパティにを使用できます。UINavigationItem.titleView
self.navigationItem.titleView = myImageView;
高さ約 35px の透明な .png がうまく機能していることがわかります。
- (void)awakeFromNib {
//put logo image in the navigationBar
UIImageView* img = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo.png"]];
self.navigationItem.titleView = img;
[img release];
}
UINavigationBarのカスタムカテゴリを次のように作成しました
UINavigationBar + CustomImage.h
#import <UIKit/UIKit.h>
@interface UINavigationBar (CustomImage)
- (void) setBackgroundImage:(UIImage*)image;
- (void) clearBackgroundImage;
- (void) removeIfImage:(id)sender;
@end
UINavigationBar + CustomImage.m
#import "UINavigationBar+CustomImage.h"
@implementation UINavigationBar (CustomImage)
- (void) setBackgroundImage:(UIImage*)image {
if (image == NULL) return;
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(110,5,100,30);
[self addSubview:imageView];
[imageView release];
}
- (void) clearBackgroundImage {
NSArray *subviews = [self subviews];
for (int i=0; i<[subviews count]; i++) {
if ([[subviews objectAtIndex:i] isMemberOfClass:[UIImageView class]]) {
[[subviews objectAtIndex:i] removeFromSuperview];
}
}
}
@end
UINavigationControllerから呼び出します
[[navController navigationBar] performSelectorInBackground:@selector(setBackgroundImage:) withObject:image];
このラインはあなたのために働きます、私はいつもこれを使います
[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"imageNavBar.png"] forBarMetrics:UIBarMetricsDefault];
UINavigationBar+CustomImage.m を変更して、タイトルがまだユーザーに表示されるようにしました。addSubview: の代わりに insertSubview: atIndex: を使用するだけです。
UINavigationBar+CustomImage.m
#import "UINavigationBar+CustomImage.h"
@implementation UINavigationBar (CustomImage)
- (void) setBackgroundImage:(UIImage*)image {
if (image == NULL) return;
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, 320, 44);
[self insertSubview:imageView atIndex:0];
[imageView release];
}
- (void) clearBackgroundImage {
NSArray *subviews = [self subviews];
for (int i=0; i<[subviews count]; i++) {
if ([[subviews objectAtIndex:i] isMemberOfClass:[UIImageView class]]) {
[[subviews objectAtIndex:i] removeFromSuperview];
}
}
}
@end
これもよく効きます
[self.navigationController.navigationBar.topItem setTitleView:[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"YourLogo"]]];
以下は、(Xamarin の) MonoTouch with C#.NET でこれを行う方法です。
NavigationController にある UIViewConvrtoller を作成し、いつでもこれを呼び出します。
someNiceViewControllerYouMade.NavigationController.NavigationBar
.InsertSubview(new UIImageView
(MediaProvider.GetImage(ImageGeneral.navBar_667x44)),0);
注: MediaProvider は、画像をフェッチする単なるクラスです。
この例では、ビューをナビゲーション バー全体に表示し、項目のキャプションのテキストも表示できるようにします。
SWIFTを使用して画像を naviagtionBar に追加します。この画像は、収まるようにスケーリングされ、境界に合わせてクリップされます。この関数は、View Controller の viewDidLoad() 関数内で呼び出すことができます。
func setupNavigationBarWithTitleImage(titleImage: UIImage) {
let imageView = UIImageView(image: titleImage)
imageView.contentMode = .ScaleAspectFit
imageView.clipsToBounds = true
navigationItem.titleView = imageView
}
ios5.0 では、標準要素の外観をカスタマイズする機能が多数導入されました。タイトルに ImageView を使用したくない場合は、背景画像とカスタム フォント/色を使用してすべての UINavbars の外観をカスタマイズすることもできます。
- (void) customiseMyNav
{
// Create resizable images
UIImage *portraitImage = [[UIImage imageNamed:@"nav_bar_bg_portrait"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
UIImage *landscapeImage = [[UIImage imageNamed:@"nav_bar_bg_landscape"]
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
// Set the background image
[[UINavigationBar appearance] setBackgroundImage:portraitImage forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setBackgroundImage:landscapeImage forBarMetrics:UIBarMetricsLandscapePhone];
// set the title appearance
[[UINavigationBar appearance] setTitleTextAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
[UIColor colorWithRed:50.0/255.0 green:150.0/255.0 blue:100/255.0 alpha:1.0],
UITextAttributeTextColor,
[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.6],
UITextAttributeTextShadowColor,
[NSValue valueWithUIOffset:UIOffsetMake(0, -1)],
UITextAttributeTextShadowOffset,
[UIFont fontWithName:@"Arial-Bold" size:0.0],
UITextAttributeFont,
nil]];
}
使うだけ
[navController.navigationBar insertSubview:myImage atIndex:0] ;
ここで、myImage は UIImageView 型で、navController は UINavigationController 型です
MonoTouch では、これを使用できます。
this.NavigationItem.TitleView = myImageView;
ナビゲーションを前後に移動するとボタンが消える場合、これで修正されました。
NSArray *mySubviews = navigationBar.subviews;
UIImageView *iv = nil;
// Move in reverse direction as not to upset the order of elements in the array
for (int i = [mySubviews count] - 1; i >= 0; i--)
{
if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
{
NSLog(@"found background at index %d",i);
iv = [mySubviews objectAtIndex:i];
[[mySubviews objectAtIndex:i] removeFromSuperview];
[navigationBar insertSubview:iv atIndex:0];
}
}
UINavigationBar+CustomImage コードを変更して、メモリ リークなしで適切に動作するようにしました。
- (void)setBackgroundImage:(UIImage *)image
{
if (! image) return;
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[self addSubview:imageView];
[imageView release];
}
- (void) clearBackgroundImage
{
// This runs on a separate thread, so give it it's own pool
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *mySubviews = self.subviews;
// Move in reverse direction as not to upset the order of elements in the array
for (int i = [mySubviews count] - 1; i >= 0; i--)
{
if ([[mySubviews objectAtIndex:i] isMemberOfClass:[UIImageView class]])
{
[[mySubviews objectAtIndex:i] removeFromSuperview];
}
}
[pool release];
}