2011-04-06 119 views
0

我试图将阴影添加到UINavigationController。我已经基于NavController,我试图添加像游戏中心一样的阴影。到目前为止,我有这个。它工作在UINavigationnBar但我试图让它在整个应用程序中工作。将阴影添加到UINavigationControllerer

CGColorRef darkColor = [[UIColor blackColor] colorWithAlphaComponent:.5f].CGColor; 
CGColorRef lightColor = [UIColor clearColor].CGColor; 

CAGradientLayer *newShadow = [[[CAGradientLayer alloc] init] autorelease]; 
newShadow.frame = CGRectMake(0, 44, 320, 10); 
newShadow.colors = [NSArray arrayWithObjects:(id)darkColor, (id)lightColor, nil]; 

CALayer *superlayer = self.newShadow.superlayer; 
[self.newShadow removeFromSuperlayer]; 
[superlayer addSublayer:self.newShadow]; 
[self.navigationBar.layer addSublayer:superlayer]; 

它直接在UINavigationBar上工作,但应用于NavigationController项目失败。它建立,但不会增加阴影。有任何想法吗?

编辑

我一直在尝试不同的方法来此。我通过使用形状成功创建了渐变。

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)drawRect:(CGRect)rect { 
UIImage *backgroundImage; 
backgroundImage = [UIImage imageNamed:@"nav.png"]; 
[backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 


CGContextRef context = UIGraphicsGetCurrentContext(); 
CGColorSpaceRef myColorspace = CGColorSpaceCreateDeviceRGB(); 
size_t num_locations = 2; 
CGFloat locations[2] = { 1.0, 0.0 }; 
CGFloat components[8] = { 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.5 }; 

CGGradientRef myGradient = CGGradientCreateWithColorComponents(myColorspace, components, locations, num_locations); 

CGPoint myStartPoint, myEndPoint; 
myStartPoint.x = 0.0; 
myStartPoint.y = 0.0; 
myEndPoint.x = 0.0; 
myEndPoint.y = 54.0; 
CGContextDrawLinearGradient (context, myGradient, myStartPoint, myEndPoint, 1); 
} 

我不能让下面UINavigationBar的梯度和它覆盖的图像。我似乎无法得到这个工作。我试图做的是添加相同的影子游戏中心。我尝试了几种不同的方法。我所需要做的就是让它位于UINavigationBar下面,让图像位于顶部,并将一小部分阴影置于UITableView的顶部,以便在UITableView上方向上滚动。如果你启动Game Center,你会看到我正在谈论的内容。

+1

这是在'UINavigationController'子类吗? – BoltClock 2011-04-06 14:06:26

+0

我试过一个子类,但它也没有工作。不,它在viewDidLoadAnimated中的UIViewController: – Frankrockz 2011-04-06 14:22:29

回答

0

我相信你应该把它添加到

UINavigationController.view.layer 

由于UINavigationController的他是不是一个UIView孩子。

如果你已经这样做了,一个其他的方式来实现导航栏,始终遍布应用程序是使用UINavigationBarCategory:

您在前人的精力将委托结束这个步伐 - 的@end

@implementation UINavigationBar (UINavigationBarCategory) 
- (void)drawRect:(CGRect)rect { 
    //implement your design 
} 
@end 

编辑

在这个环节上,你可以找到关于如何绘制条基本信息: An iPhone Graphics Drawing Tutorial using Quartz 2D

,在这里你可以找到如何添加阴影:adding shadow with quartz 2d

好运

+0

我试过'UINavigationController.view.layer',但它没有工作,但我认为不会。将它放在绘制矩形中不起作用。我没有设置子图层。我试过'[self addSublayer:newShadow]'我对如何应用它感到困惑。如果你正在使用绘制矩形,你应该尝试添加阴影而不是图层,否则其他所有东西都会生成 – Frankrockz 2011-04-06 16:00:36

+0

。但用Quartz 2d绘制一个矩形和一个阴影。我会编辑我的答案,并试图帮助你。 – shannoga 2011-04-06 16:12:26

+0

谢谢,我从来没有玩过Quartz,所以这是我第一次。非常感谢 – Frankrockz 2011-04-06 16:13:49

0

你可以继承的UIView,并使用现有的代码通过覆盖-drawRect:绘制阴影。然后在需要的地方创建它并将其添加到导航控制器的视图中。

考虑这个例子

CGFloat screenWidth = [UIScreen mainScreen].applicationFrame.size.width; 
ShadowView *shadowView = [[ShadowView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, screenWidth, 20.0f)]; 
[self.navigationController.view insertSubview:shadowView atIndex:0]; 

通过索引0将其添加到navigationController的视图,你有效地覆盖它无论视图控制器显示的顶部。您可以通过检查主屏幕的比例来适当地计算阴影视图的高度,以便它能够在所有设备上正确显示,而无需使用视网膜显示,从而进一步改善这一点。