将阴影添加到UINavigationControllerer

时间:2011-04-06 02:22:07

标签: iphone objective-c uinavigationcontroller shadow

我正在尝试为UINavigationController添加阴影。我的基于NavController,我试图在游戏中心添加阴影。到目前为止我有这个。它适用于UINavigationnBar,但我试图让它在整个应用程序中运行。

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时。如果您启动游戏中心,您将看到我正在谈论的内容。

2 个答案:

答案 0 :(得分: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

祝你好运

答案 1 :(得分: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];

通过将它添加到indexConction的navigationController视图中,您可以有效地将其覆盖在视图控制器显示的任何内容之上。你可以通过检查主屏幕的比例来进一步改善这一点,以便适当地计算阴影视图的高度,这样它就能在所有设备上正确显示,无论是否有视网膜显示。