2011-05-09 16 views
36

oluşturun. Alt gölge ile özel gezinme çubuğu arka planı oluşturmaya çalıştım ancak alt gölge arka plan görünümünü kapsıyor.nasıl UINavigationBar için gölge oluşturmak bilmek mi istiyorsunuz UINavigationBar gölge

@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 

Gezinti çubuğu düğmem için alt gölge gösterilir, ancak gezinme çubuğunun kendisi görüntülenmez.

Nihai Çözüm: Burada Ben UINavigationBar için gölge oluşturmak nasıl. Benim kod kayıp halka işaret için MusiGenesis için büyük teşekkür:

#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 içe unutmayın, aksi halde hata verir. applyDefaultStyle yılında

+0

Hızlı Bilginize, ben çağırmadan düşünüyorum '[süper willMoveToWindow: ..]' bir kategoride olduğunu – Sam

+0

Ah..yes içinde gereksiz olduğunu. Değiştirmişsin. Teşekkürler. – TonyTakeshi

+0

bu bana çok yardımcı oldu - teşekkür! – boz

cevap

28

, bu satırı eklemeyi deneyin:

self.layer.masksToBounds = NO; 

Bu özellik için varsayılan değer gölge render olsa bile, bu bakış sınırları dışında işlenen olmayacak anlamına gelir YES olduğunu Bu, onu hiç görmediğiniz anlamına gelir. Eğer animasyon yavaş ve düzensiz istemedikçe ...

self.layer.shouldRasterize = YES; 

: Eğer herhangi bir şekilde bu görüşü animasyon ediyorsanız

, ayrıca bu satırı eklemek gerekir. Eğer bir UINavigationBar bir gölge uygularsanız

+0

Teşekkürler kardeşim!Gölge kuvarsın çizilmeden önce bana çok zaman kazandırdın. O kadar kolay olmasını beklemiyordum. – TonyTakeshi

+0

Alt gölgelerin büyük bir hayranıyım ve gölgelerimin neden hiç ortaya çıkmadığını merak ederek aynı şeyi yaptım. – MusiGenesis

44

, gölge köşelerinde altında kırpılıyor:

clipped shadow

Bu gölgeler dikdörtgenler üzerine davranması ne kadar olduğunu. Genellikle daha genellikle beklediğiniz gibi bir etki yaratır gerçek gezinme çubuğunda, biraz daha geniş olduğunu gölge için bir yol oluşturmak:

@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. Bunun için teşekkür ederim. –

+0

bunu alt görünüm olarak "gölge" -png ekleyerek önerir misiniz? Performans perspektifinden soruyorum – carbonr

+0

'shouldRasterize = YES' ayarını yaparsanız, fark edilebilir bir performans farkı olduğunu düşünmüyorum. Bu yaklaşım rotasyonla da iyi çalışır, ancak daha geniş bir CGRect kullanırsanız imageView yaklaşımının işe yarayacağını varsayalım. –

9

iOS 6.0, UINavigationBar yana

elbette büyük ölçüde bu çok yaygın bir görev basitleştiren
@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR; 

:: D

-1

Ben kodu çizim gölge sopa bir özellik shadowImage vardır LoadView temiz tutmak için bir işlev içine. Eğer tüm gölgeler tutarlı isteseydi üzerine gölge çizmek istiyorum nesnesinde geçebileceği.

- (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; 
}