2011-05-09 3 views
36

UINavigationbar의 그림자 만들기를 알고 싶습니다. 그림자를 사용하여 사용자 정의 탐색 모음 배경을 만들려고했으나 그림자가 배경보기를 덮습니다.UINavigationBar 그림자 생성 방법

@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [[UIImage imageNamed:@"titleBar.png"] retain];; 
    [image drawInRect:rect]; 
    [image release]; 
} 

- (CGSize)sizeThatFits:(CGSize)size { 
    CGSize newSize = CGSizeMake(320,50); 
    return newSize; 
} 
@end 

I also tried on following solution: http://www.travisboudreaux.com/adding-a-drop-shadow-to-a-uinavigationbar: 

@interface UINavigationBar (dropshadow) 

-(void) applyDefaultStyle; 

@end 

@implementation UINavigationBar (dropshadow) 

-(void)willMoveToWindow:(UIWindow *)newWindow{ 
    [self applyDefaultStyle]; 
} 

- (void)applyDefaultStyle { 
    // add the drop shadow 
    self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    self.layer.shadowOffset = CGSizeMake(0.0, 3.0); 
    self.layer.shadowOpacity = 0.25; 
} 
@end 

네비게이션 바 버튼에는 그림자가 있지만 탐색 바는 표시되지 않습니다.

최종 솔루션 : 다음은 UINavigationBar의 그림자를 만드는 방법입니다. 내 코드의 누락 된 링크를 지적 MusiGenesis에 대한 큰 감사 :

#import <QuartzCore/QuartzCore.h> 

@interface UINavigationBar (CustomImage) 

-(void) applyDefaultStyle; 

@end 

//Override For Custom Navigation Bar 
@implementation UINavigationBar (CustomImage) 
- (void)drawRect:(CGRect)rect { 
    UIImage *image = [UIImage imageNamed: @"titleBar.png"]; 
    [image drawInRect:CGRectMake(0, 0, 320, 44)]; 
} 

-(void)willMoveToWindow:(UIWindow *)newWindow{ 
    [super willMoveToWindow:newWindow]; 
    [self applyDefaultStyle]; 
} 

- (void)applyDefaultStyle { 
    // add the drop shadow 
    self.layer.shadowColor = [[UIColor blackColor] CGColor]; 
    self.layer.shadowOffset = CGSizeMake(0.0, 3); 
    self.layer.shadowOpacity = 0.25; 
    self.layer.masksToBounds = NO; 
    self.layer.shouldRasterize = YES; 
} 

@end 

** quartzcore을 가져 기억 아니면 오류가 발생합니다. applyDefaultStyle에서

+0

빠른 참고로, 내가 호출 생각'[슈퍼 willMoveToWindow : ..] '카테고리 그것이 – Sam

+0

Ah..yes에서 중복됩니다. 수정했습니다. 감사. – TonyTakeshi

+0

이것이 나에게 많은 도움이되었습니다 - 감사합니다! – boz

답변

28

이 줄을 추가하십시오 :

self.layer.masksToBounds = NO; 

이 속성의 기본값은 그림자가 렌더링에도 불구하고,이 뷰의 범위를 벗어난 렌더링되지 않음을 의미하는 YES입니다 , 그것은 당신이 전혀 그것을 보지 못한다는 것을 효과적으로 의미합니다. 당신이 애니메이션이 느리고 불규칙적되고 싶어하지 않는 한 ...

self.layer.shouldRasterize = YES; 

: 당신이 어떤 방법으로이보기를 애니메이션하는 경우

은 또한이 줄을 추가해야합니다. 당신이 UINavigationBar에 그림자를 적용하면

+0

감사합니다.당신은 석영으로 그늘을 그려 넣기 전에 많은 시간을 구해 줬습니다. 나는 그것이 그렇게 쉽지 않을 것이라고 기대하지 않았다. – TonyTakeshi

+0

나는 그림자의 큰 팬이고, 나는 왜 그림자가 나타나지 않는지 궁금해했다. – MusiGenesis

44

, 그림자는 모서리 아래에서 잘립니다 :

clipped shadow

이 그림자는 직사각형에 행동이 얼마나입니다. 나는 보통 더 일반적으로 기대하는 것 같다 효과를 만들어 실제 탐색 모음,보다 약간 넓은의 그림자에 대한 경로를 만들 :

@implementation UINavigationBar (DropShadow) 

-(void)willMoveToWindow:(UIWindow *)newWindow { 
    [super willMoveToWindow:newWindow]; 
    self.layer.shadowColor = [UIColor blackColor].CGColor; 
    self.layer.shadowOpacity = 1; 
    self.layer.shadowOffset = CGSizeMake(0,4); 
    CGRect shadowPath = CGRectMake(self.layer.bounds.origin.x - 10, self.layer.bounds.size.height - 6, self.layer.bounds.size.width + 20, 5); 
    self.layer.shadowPath = [UIBezierPath bezierPathWithRect:shadowPath].CGPath; 
    self.layer.shouldRasterize = YES; 
} 

better

+1

ShadowPath. 고마워요. –

+0

"그림자"-png를 하위보기로 추가하는 것 이상으로 제안 하시겠습니까? 성능 관점에서 묻는 중입니다 – carbonr

+0

'shouldRasterize = YES'를 설정하면 성능 차이가 눈에 띄지 않습니다. 이 접근법은 회전에서도 잘 작동하지만 넓은 CGRect를 사용하는 경우 imageView 접근 방식이 효과가 있다고 가정합니다. –

9

아이폰 OS 6.0, UINavigationBar 이후

물론 크게이 매우 일반적인 작업을 단순화
@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; 

: D

-1

내가 코드를 그리기 그림자 스틱 속성 쉐도우 이미지를 가지고 loadView를 깨끗하게 유지하는 함수로 변환합니다. 모든 그림자를 일관되게 원한다면 그림자를 그리기를 원하는 객체를 전달할 수 있습니다.

- (void)loadView 
{ 
    self.view = [[UIView alloc] init]; 
    self.view.backgroundColor = [UIColor whiteColor]; 

    [self drawShadow]; 
} 


- (void)drawShadow 
{ 
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor]; 
    self.navigationController.navigationBar.layer.shadowOpacity = 0.3; 
    self.navigationController.navigationBar.layer.shadowOffset = CGSizeMake(0, 0); 
    self.navigationController.navigationBar.layer.shadowRadius = 15; 
    self.navigationController.navigationBar.layer.masksToBounds = NO; 
}