화산 논검 - 사용자 정의 UINavigation Bar 배경 방법 총집합(나 소장하고 있잖아)

8508 단어 NavigationBar

자고로 무림의 검법 문파가 많아서 매년 9월 9일의 화산 논검이 생겼다고...
iOS 개발은 어떤 면에서도 마찬가지다.사용자 정의 UINavigationBar라는 아주 작은 부분도 있고 N가지 방법도 있어서 저는 답을 찾는 과정에서 많은 시행착오를 겪었고 많은 시간을 들였습니다.지금 이 방법들을 비교해 보면 누가 우수하고 누가 열악한지 독자에게 생각하게 한다.
 
1. 엑소시즘 검법
이 검법은 매우 초급이다
시스템이 정의한 스타일만 가능합니다.다음과 같습니다.

[코드] c# /cpp/oc 코드:

[self.navigationController.navigationBar setBarStyle:UIBarStyleBlackOpaque];

 
2. 송풍 검법
이 검법은 규범에 맞게 서로 다른 변화가 있을 수 있다.
bar의 색상은 다음과 같이 변경할 수 있습니다.

[코드] c# /cpp/oc 코드:

[self.navigationController.navigationBar setTintColor:[UIColor orangeColor]];

 
3. 태극검법
이 검법은 보기에는 신기한 것 같지만, 사실은 대단하지 않다.
titleView만 수정할 수 있고 배경은 다음과 같이 사용자 정의할 수 없습니다.

[코드] c# /cpp/oc 코드:

UIImage *logo = [UIImage imageNamed:@"title_bg"];
    [self.navigationItem setTitleView:[[[UIImageView alloc] initWithImage:logo] autorelease]];

그걸로 배경을 고치고 싶으면 실망할 거야...
 
4. 칠성 검법
이 검법은 수수하고 나무가 흐리멍덩하여 당신의 눈을 반짝이게 하지만, 여러 가지 제한이 있어야만 특정 조건에서만 위력을 발휘할 수 있습니다.
iOS5에만 유효합니다.다음과 같습니다.

[코드] c# /cpp/oc 코드:

- (void)customizeAppearance
{
    // Create resizable images
    UIImage *gradientImage44 = [[UIImage imageNamed:@"surf_gradient_textured_44"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
    UIImage *gradientImage32 = [[UIImage imageNamed:@"surf_gradient_textured_32"] 
        resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
 
    // Set the background image for *all* UINavigationBars
    [[UINavigationBar appearance] setBackgroundImage:gradientImage44 
        forBarMetrics:UIBarMetricsDefault];
    [[UINavigationBar appearance] setBackgroundImage:gradientImage32 
        forBarMetrics:UIBarMetricsLandscapePhone];
 
    // Customize the title text for *all* UINavigationBars
    [[UINavigationBar appearance] setTitleTextAttributes:
        [NSDictionary dictionaryWithObjectsAndKeys:
            [UIColor colorWithRed:255.0/255.0 green:255.0/255.0 blue:255.0/255.0 alpha:1.0], 
            UITextAttributeTextColor, 
            [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.8], 
            UITextAttributeTextShadowColor, 
            [NSValue valueWithUIOffset:UIOffsetMake(0, -1)], 
            UITextAttributeTextShadowOffset, 
            [UIFont fontWithName:@"Arial-Bold" size:0.0], 
            UITextAttributeFont, 
            nil]];
 
}

간단하게 다음 코드입니다.

[코드] c# /cpp/oc 코드:

UINavigationBar *navBar = [myNavController navigationBar];
if ([navBar respondsToSelector:@selector(setBackgroundImage:forBarMetrics:)])
{
    // set globablly for all UINavBars
    [[UINavigationBar appearance] setBackgroundImage:[UIImage imageNamed:@"brnlthr_nav.jpg"] forBarMetrics:UIBarMetricsDefault];
  // ...
}

 
5. 태극검법
이 검법은 매우 간단해서 주로 내력에 의존하지만 마찬가지로 제한을 받는다.
iOS5 이전 버전에만 유효하며 다음과 같습니다.

[코드] c# /cpp/oc 코드:

@implementation UINavigationBar (CustomImage)
- (void)drawRect:(CGRect)rect {
    // Drawing code
    UIImage *image = [[UIImage imageNamed:@"header.png"] retain];
    [image drawInRect:CGRectMake(0, 0,self.frame.size.width , self.frame.size.height)];
    [image release];
    }
@end

 
6. 암수 쌍발 검법
상기 칠성검법과 태극검법을 접합하면 자웅쌍주검법을 형성하고 iOS버전에 따라 각자의 위력을 발휘하여 제한을 받지 않는다.
 
7. 양의검법
이 검법은 태극검법에서 유래한 것으로 이른바'태극생양의'...올가미는 약간 다르지만 iOS5 이전 버전으로 제한됩니다.

[코드] c# /cpp/oc 코드:

@interface MyNavigationBar : UINavigationBar

@end

[코드] c# /cpp/oc 코드:

@implementation MyNavigationBar

- (void)drawRect:(CGRect)rect 
{
    [super drawRect:rect];
}
@end

@implementation UINavigationBar (LazyNavigationBar)
+ (Class)class {
    return NSClassFromString(@"MyNavigationBar");
}

-(void)drawRect:(CGRect)rect {
    UIImage *backImage = [UIImage imageNamed:@"title_bg"];
[backImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];      
}
@end

 
8. 금사검법
이 검법은 힘이 세고 사납기 때문에 당해내기 어렵다.
 
먼저 CustomNaviBar 클래스를 쓰십시오.

[코드] c# /cpp/oc 코드:

@interface CustomNaviBar : UINavigationBar
@end

@implementation CustomNaviBar
- (void)drawRect:(CGRect)rect {
	[[UIImage imageNamed:@"title_bg"] drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}
@end

 
그리고 xib 파일을 만들고 UINavigation Controller를 끌어내서 UINavigation Controller의 UINavigation Bar를 사용자 정의CustomNaviBar로 바꿉니다
 
그런 다음 xib 파일을 사용하여 UINavigationController를 만듭니다.

[코드] c# /cpp/oc 코드:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    
    UINib *nib = [UINib nibWithNibName:@"Empty" bundle:nil];
    UINavigationController* nc =  [[nib instantiateWithOwner:nil options:nil] objectAtIndex:0];//
    self.window.rootViewController = nc;
    
    self.viewController = nil;
    
    [self.window makeKeyAndVisible];
    return YES;
}

 
이 방법은 모든 iOS 플랫폼을 통식하며 무림 맹주의 실력을 독보한다.
 
9.독고구검
전설의 궁극의 검법은 위력이 비할 바 없다.
 
모든 IOS 버전이 적용됩니다.
 
먼저 appDelegate에 navigationController 속성을 추가합니다.

[코드] c# /cpp/oc 코드:

@interface DymAppDelegate : UIResponder <UIApplicationDelegate>
{
	UINavigationController *navController_;
}
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) DymViewController *viewController;

@property (nonatomic, readonly, retain) UINavigationController *navigationController;
@end

 
그런 다음 rootViewController:

[코드] c# /cpp/oc 코드:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    
    self.viewController = [[[DymViewController alloc] initWithNibName:@"DymViewController" bundle:nil] autorelease];
    
    self.window.rootViewController = self.navigationController;
    
    self.viewController = nil;
    
    [self.window makeKeyAndVisible];
    return YES;
}

 
다음은 이 검법의 심법:

[코드] c# /cpp/oc 코드:

- (UINavigationController*)navigationController {
	if (navController_ == nil) {
		UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.viewController];
		
		// Archive navigation controller for changing navigationbar class
		[navController navigationBar];
		NSMutableData *data = [[NSMutableData alloc] init];
		NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
		[archiver encodeObject:navController forKey:kRootKey];
		[archiver finishEncoding];
		[archiver release];
		[navController release];
		
		// Unarchive it with changing navigationbar class
		NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
		[unarchiver setClass:[CustomNaviBar class]
				forClassName:NSStringFromClass([UINavigationBar class])];
		navController_ = [[unarchiver decodeObjectForKey:kRootKey] retain];
		[unarchiver release];
		
		[data release];
	}
	return navController_;
}

NSKeyedArchiver와 NSKeyedUnarchiver를 이용하여 navigationbar를 수정합니다...
 
독고구검이 나오자마자 금사검법도 빛을 잃었다. 정말 대단한 B의 검법이다. 이번 화산에서 검을 논하자면 맹주의 자리는 그가 아니면 안 된다.하하
 
=======================================
후기: 비록 이번에 독고구검이 천하제일검이라는 칭호를 얻었지만 세계가 크면 반드시 다른 강력한 검법이 있을 것이다. 여기서 벽돌을 던져 옥을 끌어올리고 내년에 화산이 다시 공격할 수 있기를 기대한다.
 

좋은 웹페이지 즐겨찾기