如何创建UINavigationBar投影

Ton*_*shi 37 iphone objective-c

想知道为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
Run Code Online (Sandbox Code Playgroud)

它显示我的导航栏按钮的阴影,但没有导航栏本身.

最终解决方案: 这是我为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
Run Code Online (Sandbox Code Playgroud)

**记得输入quartzcore或它会抛出错误.

Chr*_*lay 44

如果对a应用投影,阴影将UINavigationBar被剪裁在角落下方:

剪裁的阴影

这就是阴影在矩形上的行为方式.我通常会创建一个比实际导航栏更宽的阴影路径,这会创建一个更像您通常期望的效果:

@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;
}
Run Code Online (Sandbox Code Playgroud)

更好


Mus*_*sis 30

applyDefaultStyle,尝试添加此行:

self.layer.masksToBounds = NO;
Run Code Online (Sandbox Code Playgroud)

此属性的默认值是YES,这意味着即使渲染阴影,它也不会在视图边界之外渲染,这实际上意味着您根本看不到它.

如果您以任何方式为此视图设置动画,则还应添加以下行:

self.layer.shouldRasterize = YES;
Run Code Online (Sandbox Code Playgroud)

...除非你想让动画变得缓慢而生涩.


Map*_*edd 9

从iOS 6.0开始,UINavigationBar有一个属性shadowImage:

@property(nonatomic,retain) UIImage *shadowImage NS_AVAILABLE_IOS(6_0) UI_APPEARANCE_SELECTOR;
Run Code Online (Sandbox Code Playgroud)

这当然大大简化了这个非常常见的任务:D