navigationController


// 코딩으로 네이비게이션 콘트롤러 설정하기..

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow allocinitWithFrame:[[UIScreen mainScreenbounds]] autorelease];
    
    ItemsViewController *itemsViewController = [[ItemsViewController allocinit];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:itemsViewController];
    [itemsViewController release];
    [[self windowsetRootViewController:navigationController];
    [navigationController release];
                                                       //  window <- navigationController <-  마스터로 쓰일  ItemViewController    


    [self.window makeKeyAndVisible];
    return YES;
}

-(id)init 
{
    self = [super initWithStyle:UITableViewStyleGrouped];
    if (self) 
    {
        UIBarButtonItem *bbi = [[UIBarButtonItem allocinitWithBarButtonSystemItem:UIBarButtonSystemItemAdd 
                                                                             target:self action:@selector(addNewPossession:)];
        [[self navigationItemsetRightBarButtonItem:bbi];      //  버튼은 navigationItem  에 
        [bbi release];                                                                    // 해당  rootViewController  의 init이나 viewDidLoad에서 
        
        [[self navigationItemsetTitle:@"Homepwner"];
        
       [[self navigationItemsetLeftBarButtonItem:[self editButtonItem]];
                                                                                              // TableViewController 자체 버튼 씀..
    }
    return self;
}



- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow allocinitWithFrame:[[UIScreen mainScreenbounds]] autorelease];

    RootViewController *rootViewController = [[RootViewController allocinit];
    UINavigationController *navigationController = [[UINavigationController allocinitWithRootViewController: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 allocinitWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
                                                                                                 target:self action:@selector(btnWrite)];
        [[self navigationItemsetRightBarButtonItem:bbi];
        [bbi release];
        
        UIImageView *imageView = [[UIImageView allocinitWithImage:[UIImage imageNamed:@"123.png"]];
        
        UIView *myView = [[UIView allocinit];
        [myView addSubview:imageView];
        
        [[self navigationItemsetTitleView:myView];    // 요서 이리 네이게이션 바의 이미지 설정해줄수 있음.
                                                                                                                        // 근데  navigationBar 가 아니라 navigationItem에 있음.
        //[self navigationItem].titleView = myView;
        //[[self navigationItem].titleView addSubview:myView];  ????
        
        myView.frame = CGRectMake(-5032044);
        
    }
    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];
}
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];
 return YES;
}
이것은 코드를 통해 만들수 있다는 한가지 예일 뿐이고 실제 interface builder를 이용해서 만드셔도 상관 없죠.
 
2.Title 바꾸기
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My Title";
}
화면별로 각각의 ViewController에 따라서 Title을 변경해야 될 떄 사용 되겠죠.

3.Navigation Bar 숨기기 & 보이기
- (void)viewDidLoad 
{
    [super viewDidLoad];
     self.title = @"My Title";
     self.navigationController.navigationBarHidden = YES; //YES : 숨기기, NO : 보이기
}
위 코드는 Navigation Bar를 숨기는 코드 입니다. 이처럼 ViewController에 따라서 보여줄수도 있고 숨길수 있습니다.
다시 보이게 하려면 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];

}

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이 있죠.

6. Navigation Bar 배경이미지 넣기 (Background image)
@implementation UINavigationBar (UINavigationBarCategory)
- (void)drawRect:(CGRect)rect
{
   UIImage *bgImage = [UIImage imageNamed:@"background.png"];
   [bgImage drawInRect:rect];
}
@end
UInavigationBar 서브클래스를 만들어서 구현합니다.

7. Navigation Bar Back 버튼의 Text 변경 하기
- (void)viewDidLoad 
{
    [super viewDidLoad];
    self.title = @"My title";
    self.navigationController.navigationBar.backItem.title = @"뒤로가기";
}
본래 "Back"이라는 Text가 들어가는데 "뒤로가기" 라고 바꿔 주었습니다.위 코드는 상황에 따라 적용되지 않을 수 있습니다.
가령 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하는 방법 입니다.
즉 뷰를 이동하고 나서 처리하는 것이 아니라 이동하기 전에 백버튼을 설정하고 이동하는 처리 입니다.

여기서 하나 더 알아봅시다.
NavigationController에서 화면 전환시 이전 화면으로 이동하고자 할 때 바로 이전 화면이 아닌 자신이 원하는 이전 화면으로 이동하고 싶을 때 처리는 어떻게 할까요.

다음을 보시죠
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:0] animated:YES];
위처럼 objectAtIndex값을 설정해서 이전의 원하는 컨트롤러로 이동할 수 있습니다.

8.Navigation Bar 오른쪽의 버튼 아이템 추가하기
- (void)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
{
     NSLog(@"Log-in Action");
}





0 댓글