2011-05-09 25 views
36

Muốn biết tạo bóng đổ cho thanh UINavigation. Tôi đã cố gắng tạo nền thanh điều hướng tùy chỉnh với bóng đổ, nhưng bóng đổ bao phủ chế độ xem nền.Cách tạo bóng thả 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 

Nút này hiển thị bóng thả cho nút thanh điều hướng của tôi, nhưng không có thanh điều hướng.

Giải pháp cuối cùng: Đây là cách tôi tạo bóng thả cho UINavigationBar. Cảm ơn bạn đã gửi đến MusiGenesis để chỉ ra liên kết còn thiếu của mã của tôi:

#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 

** Hãy nhớ nhập thạch anh hoặc lỗi sẽ ném lỗi.

+0

Nhanh chóng, tôi nghĩ gọi '[super willMoveToWindow: ..]' là dư thừa trong một danh mục – Sam

+0

Ah..có vẻ như vậy. Đã sửa đổi nó. Cảm ơn. – TonyTakeshi

+0

điều này đã giúp tôi rất nhiều - cảm ơn! – boz

Trả lời

28

Trong applyDefaultStyle, hãy thử thêm dòng này:

self.layer.masksToBounds = NO; 

Giá trị mặc định cho thuộc tính này là YES, có nghĩa là mặc dù cái bóng được trả lại, nó sẽ không được thực hiện bên ngoài các giới hạn của tầm nhìn , có nghĩa là bạn không thấy nó một cách hiệu quả.

Nếu bạn đang tạo hiệu ứng động quan điểm này trong bất kỳ cách nào, bạn cũng nên thêm dòng này:

self.layer.shouldRasterize = YES; 

... trừ khi bạn muốn các hình ảnh động để được làm chậm và giật.

+0

Cảm ơn bro!Bạn đã tiết kiệm cho tôi rất nhiều thời gian trước khi ở trong bản vẽ bóng với thạch anh. Tôi đã không mong đợi nó được dễ dàng. – TonyTakeshi

+0

Tôi là một fan hâm mộ lớn của bóng đổ, và tôi đã đi qua cùng một điều tự hỏi tại sao bóng của tôi không bao giờ xuất hiện. – MusiGenesis

44

Nếu bạn áp dụng một bóng thả cho một UINavigationBar, bóng bị cắt cụt ở bên dưới các góc:

clipped shadow

Đây chỉ là cách cư xử bóng trên hình chữ nhật. Tôi thường tạo ra một đường dẫn cho các bóng đó là một chút rộng hơn so với thanh nav thực tế, mà tạo ra một hiệu ứng mà là giống như những gì bạn thường mong đợi:

@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. Cảm ơn vì điều đó. –

+0

bạn sẽ đề xuất điều này bằng cách thêm "bóng" -png làm chế độ xem phụ. Tôi hỏi từ quan điểm hiệu suất – carbonr

+0

Nếu bạn đặt 'shouldRasterize = YES', tôi không nghĩ rằng có bất kỳ sự khác biệt hiệu suất rõ rệt nào. Cách tiếp cận này cũng hoạt động tốt với xoay vòng, mặc dù tôi cho rằng cách tiếp cận imageView sẽ hoạt động nếu bạn sử dụng CGRect rộng hơn. –

9

Kể từ iOS 6.0, UINavigationBar có ShadowImage tài sản:

@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; 

trong đó tất nhiên làm đơn giản hóa nhiệm vụ rất phổ biến này: D

-1

tôi dính vào cái bóng vẽ đang vào một chức năng để giữ loadView sạch sẽ. Bạn có thể vượt qua trong đối tượng mà bạn muốn vẽ bóng nếu bạn muốn tất cả các bóng của bạn nhất quán.

- (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; 
} 
Các vấn đề liên quan