// 코딩으로 네이비게이션 콘트롤러 설정하기..
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
ItemsViewController *itemsViewController = [[ItemsViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:itemsViewController];
[itemsViewController release];
[[self window] setRootViewController:navigationController];
[navigationController release];
// window <- navigationController <- 마스터로 쓰일 ItemViewController
[self.window makeKeyAndVisible];
return YES;
}
-(id)init
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self)
{
UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd
target:self action:@selector(addNewPossession:)];
[[self navigationItem] setRightBarButtonItem:bbi]; // 버튼은 navigationItem 에
[bbi release]; // 해당 rootViewController 의 init이나 viewDidLoad에서
[[self navigationItem] setTitle:@"Homepwner"];
[[self navigationItem] setLeftBarButtonItem:[self editButtonItem]];
// TableViewController 자체 버튼 씀..
}
return self;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
RootViewController *rootViewController = [[RootViewController alloc] init];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleBlackTranslucent;
//navigationController.navigationBar.barStyle = 2;
[navigationController.navigationBar setTintColor:[UIColor colorWithRed:30/255 green:58/255 blue:151/255 alpha:1]];
// 네이게이션 바 색깔 설정은 navigationBar에서
// 위에 버튼 처럼 해당 ViewController 에서 접근 할수 없음. 소유 하고 있는 쪽에서 접근해야함. navigationBar 에 있는것들은..
[self.window setRootViewController:navigationController];
[self.window makeKeyAndVisible];
return YES;
}
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose
target:self action:@selector(btnWrite)];
[[self navigationItem] setRightBarButtonItem:bbi];
[bbi release];
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"123.png"]];
UIView *myView = [[UIView alloc] init];
[myView addSubview:imageView];
[[self navigationItem] setTitleView:myView]; // 요서 이리 네이게이션 바의 이미지 설정해줄수 있음.
// 근데 navigationBar 가 아니라 navigationItem에 있음.
//[self navigationItem].titleView = myView;
//[[self navigationItem].titleView addSubview:myView]; ????
myView.frame = CGRectMake(-5, 0, 320, 44);
}
return self;
}
navigationController
↙ ↘
navigationBar navigationItem
↙ ↘ ↙ ↓ ↘
tintColor barStyle barButtonItem titleView title
(UIColor *) (UIBarStyle *) (UIBarButtonItem *) (UIView *) (NSString *)
이쪽 놈들은 대빵에서 이쪽 놈들은 init 할때..
// 참고로 네이게이션 바의 이미지를 직접 이미지 안 부르고.. View Class에서 작업한 넘으로 걸어 줄 수 있음..
// 아래 내용은 stackOver Flow에서 긁어온 내용인데.. 그 내용에 해당..
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed: @"NavigationBar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
I guess it is also possible to method swizzling but from everything I've read this isn't a great approach as UIKit changes will break my code. The problem I have with approach this is changing the background image when new view controllers are popped off the stack. I seem to be able to modify the image when they are pushed but when I pop the view controller I am not able to change the image back. Is there a way I can listen for the user taps the back button on the navigationcontroller and trigger an image change at that point? Also curious as to whether this kind of practice is discouraged by Apple.
You could try to use this method to set the background image programmatically. Link to Apple Docs
willShowViewController:animated
you could try this way
create a global constant variable.
@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
UIImage *image =nil;
if(CONSTANT==1)
image= [UIImage imageNamed: @"NavigationBar.png"];
else
image= [UIImage imageNamed: @"newbar.png"];
[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end
in UIViewController
-(void)viewWillAppear:(BOOL)animated{
CONSTANT=2;//CONSTANT=1
[self.navigationController.navigationbar setNeedsDisplay];
}
http://stackoverflow.com/questions/4935134/iphone-uinavigationbar-custom-image-change-as-new-view-controller-are-popped-o
----------------------------------------------------------------------
UINavigationController 사용법!!!----------------------------------------------------------------------
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)
launchOptions{
RootViewController * rootViewController = [[RootViewController alloc]
initwithNibName:@"RootViewController" bundle:nil];
UINavigationController *navigationcontroller = [[UINavigationController alloc]
initWithRootViewController:rootViewController];
[self.window addSubview:navigationController:view];
[self.window makeKeyAndVisible];
return YES;
}
이 위의 소스로 UINavigationControoller 을 만들수 있습니다.
UINavigationController 의 세부 소스들을 한번 알아보겠습니다.
1. Navigation Bar 숨기기 또는 보이기 기능...
-(void)viewDidLoad{
[super viewDidLoad];
self.navigationController.navigationBarHidden = YES;
//YES : 숨기기 기능
//NO : 보이기 기능
}
2. Title 바꾸는 방법!!!
-(void)viewDidLoad{
[super viewDidLoad];
self.title = @"IPHONE DEVELOPER";
}
타이틀 적용 네비게이션 바에 IPHONE DEVELOPER 라는 글자가 적용.
3. Navigation Bar 배경색을 바꾸는 방법!!
-(void)viewDidLoad{
[super viewDidLoad];
self.title = @"IPHONE DEVELOPER"
self.navigationController.navigationBar.barStyle = UIBarStyleBlack;
// 스타일을 적용할수 있습니다.
self.navigationController.navigationBar.translucent = YES;
// 이것은 반투명을 주는 효과 입니다
}
4. Navigation Bar 배경이미지를 넣는 방법!!
@implementation UINavigationBar (UINavigationBarCategory)
-(void)drawRect:(CGRECT)rect{
UIImage *bgimage = [UIImage imageNamed:@"background.png"];
[bgimage drawInRect:rect];
}
@end
서브클래스 만들어 구현...
5. 네비게이션 바 뒤로가기 버튼 텍스트 변경방법!!
-(void)viewDidLoad{
[super viewDidLoad];
self.navigationController.navigationBar.backItem.title = @"뒤로가기";
}
이렇게 소스 작성하시면 버튼에 back 가 아니고 뒤로가기라는 글씨가 적용.
[아이폰 개발] UINavigationController Customization (title, background color, image, add button)
1. 코드를 이용해 UINavigationController 만들기
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RootViewController * rootViewController = [[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];
[self.window addSubview:navigationController.view];
[self.window makeKeyAndVisible];
return YES;
}
이것은 코드를 통해 만들수 있다는 한가지 예일 뿐이고 실제 interface builder를 이용해서 만드셔도 상관 없죠.}
2.Title 바꾸기
- (void)viewDidLoad
{
[super viewDidLoad];
{
[super viewDidLoad];
self.title = @"My Title";
}
화면별로 각각의 ViewController에 따라서 Title을 변경해야 될 떄 사용 되겠죠.}
3.Navigation Bar 숨기기 & 보이기
- (void)viewDidLoad
{
[super viewDidLoad];
{
[super viewDidLoad];
self.title = @"My Title";
self.navigationController.navigationBarHidden = YES; //YES : 숨기기, NO : 보이기
}
self.navigationController.navigationBarHidden = YES; //YES : 숨기기, NO : 보이기
}
위 코드는 Navigation Bar를 숨기는 코드 입니다. 이처럼 ViewController에 따라서 보여줄수도 있고 숨길수 있습니다.
다시 보이게 하려면 self.navigationController.navigationBarHidden값을 NO로 하시면 되겠습니다.
4. Navigation Bar 배경색 바꾸기 (Background Color)
5. Navigation Bar Style 바꾸기
6. Navigation Bar 배경이미지 넣기 (Background image)
7. Navigation Bar Back 버튼의 Text 변경 하기
가령 UITabbarController와 UINavigationController를 같이 사용하면서 pushViewController를 이용해 뷰를 이동할 때 안되더군요.
이때는 다음과 같이 해결 합니다.
즉 뷰를 이동하고 나서 처리하는 것이 아니라 이동하기 전에 백버튼을 설정하고 이동하는 처리 입니다.
여기서 하나 더 알아봅시다.
NavigationController에서 화면 전환시 이전 화면으로 이동하고자 할 때 바로 이전 화면이 아닌 자신이 원하는 이전 화면으로 이동하고 싶을 때 처리는 어떻게 할까요.
다음을 보시죠
8.Navigation Bar 오른쪽의 버튼 아이템 추가하기
다시 보이게 하려면 self.navigationController.navigationBarHidden값을 NO로 하시면 되겠습니다.
4. Navigation Bar 배경색 바꾸기 (Background Color)
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"My Title";
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:255.0/255
green:10.0/255 blue:100.0/255 alpha:1];
}
{
[super viewDidLoad];
self.title = @"My Title";
self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:255.0/255
green:10.0/255 blue:100.0/255 alpha:1];
}
5. Navigation Bar Style 바꾸기
- (void)viewDidLoad
{
super viewDidLoad];
self.title = @"My Title";
self.navigationController.navigationBar.barStyle = UIBarStyleBlack; //스타일 적용
self.navigationController.navigationBar.translucent = YES; // 반투명 효과 주기
}
스타일에는 기본적으로 UIBarStyleBlack, UIBarStyleBlackOpaque, UIBarStyleBlackTranslucent, UIBarStyleDefault이 있죠.{
super viewDidLoad];
self.title = @"My Title";
self.navigationController.navigationBar.barStyle = UIBarStyleBlack; //스타일 적용
self.navigationController.navigationBar.translucent = YES; // 반투명 효과 주기
}
6. Navigation Bar 배경이미지 넣기 (Background image)
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect
{
UIImage *bgImage = [UIImage imageNamed:@"background.png"];
[bgImage drawInRect:rect];
}
@end
UInavigationBar 서브클래스를 만들어서 구현합니다.{
UIImage *bgImage = [UIImage imageNamed:@"background.png"];
[bgImage drawInRect:rect];
}
@end
7. Navigation Bar Back 버튼의 Text 변경 하기
- (void)viewDidLoad
{
[super viewDidLoad];
{
[super viewDidLoad];
self.title = @"My title";
self.navigationController.navigationBar.backItem.title = @"뒤로가기";
}
본래 "Back"이라는 Text가 들어가는데 "뒤로가기" 라고 바꿔 주었습니다.위 코드는 상황에 따라 적용되지 않을 수 있습니다.self.navigationController.navigationBar.backItem.title = @"뒤로가기";
}
가령 UITabbarController와 UINavigationController를 같이 사용하면서 pushViewController를 이용해 뷰를 이동할 때 안되더군요.
이때는 다음과 같이 해결 합니다.
UIBarButtonItem *backButton = [[UIBarButtonItem alloc]
initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target:nil action:nil];
[[self navigationItem] setBackBarButtonItem: backButton];
UINavigationController *homeNav = self.navigationController;
LoginView * loginView = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
[homeNav pushViewController:loginView animated:YES];
위 코드는 이동하고자 하는 뷰(LoginView)를 push하는 뷰 컨트롤러에서 백버튼을 재설정한 후에 뷰를 push하는 방법 입니다.initWithTitle: @"Back"
style: UIBarButtonItemStyleBordered
target:nil action:nil];
[[self navigationItem] setBackBarButtonItem: backButton];
UINavigationController *homeNav = self.navigationController;
LoginView * loginView = [[LoginView alloc] initWithNibName:@"LoginView" bundle:nil];
[homeNav pushViewController:loginView animated:YES];
즉 뷰를 이동하고 나서 처리하는 것이 아니라 이동하기 전에 백버튼을 설정하고 이동하는 처리 입니다.
여기서 하나 더 알아봅시다.
NavigationController에서 화면 전환시 이전 화면으로 이동하고자 할 때 바로 이전 화면이 아닌 자신이 원하는 이전 화면으로 이동하고 싶을 때 처리는 어떻게 할까요.
다음을 보시죠
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
위처럼 objectAtIndex값을 설정해서 이전의 원하는 컨트롤러로 이동할 수 있습니다.8.Navigation Bar 오른쪽의 버튼 아이템 추가하기
- (void)viewDidLoad
{
[super viewDidLoad];
{
[super viewDidLoad];
self.title = @"My Title";
UIBarButtonItem *loginButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Log in"
style:UIBarButtonItemStylePlain target:self
action:@selecter(ActLogin)];
self.navigationItem.rightBarButtonItem = loginButtonItem;
[loginButtonItem release];
}
//버튼을 눌렀을 때 이벤트 처리
-(IBAction) ActLogin:(id)sender
{
style:UIBarButtonItemStylePlain target:self
action:@selecter(ActLogin)];
self.navigationItem.rightBarButtonItem = loginButtonItem;
[loginButtonItem release];
}
//버튼을 눌렀을 때 이벤트 처리
-(IBAction) ActLogin:(id)sender
{
NSLog(@"Log-in Action");
}
}
0 댓글