iOS:在导航栏下方添加固定图像

3
这似乎应该很简单,但是迄今为止我尝试过的所有方法都没有奏效。简而言之,我想在通过编程创建的UITableViewController的导航栏下方添加一个固定的图像。换句话说,即使用户上下滚动表视图,图片也应保持在导航栏下方(它基本上是导航栏的自定义阴影)。
我最接近的代码如下(在UITableViewController的init方法中),它添加了图片,但是当用户滚动时无法固定图片位置。
// Add nav bar drop shadow
UIImage *dropShadowImage = [UIImage imageNamed:@"NavBarDropShadow.png"];
UIImageView *dropShadowView = [[UIImageView alloc] initWithImage:dropShadowImage];
[self.view addSubview:dropShadowView];

有没有一种简单的方法,可以通过编程方式将图像添加到屏幕上,按照您喜欢的位置定位它,并使其保持原位,即使用户滚动屏幕?感谢您提供的任何和所有建议!

5个回答

2

编辑:IOS5 有更好的方法来完成这个任务。请查看新的UIAppearance协议。

将以下代码块添加到您的代码中,将允许您在应用程序中的所有UINavigationBars上绘制阴影。这比将阴影添加为UIImageView更好的解决方案:

@implementation UINavigationBar (ShadowBar)
- (void)drawRect:(CGRect)rect {
    //draw the shadow ui nav bar
    UIImage *image = [UIImage imageNamed: @"UINavBarWithShadow.png"];
    [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)];
}

- (void)layoutSubviews {
    self.frame = CGRectMake(0, 0, self.frame.size.width, 300);
}
@end

为了使UINavigationBar更高,从而不会剪切您的内容,请重写layoutSubviews并设置您需要的框架(上面的代码假设您的标题高度为300点)。默认情况下,layoutSubviews什么也不做,但是在布局视图之前“懒惰”调用。有关应用于UIView(以及任何其他子类)的自定义大小/外观覆盖的更多信息,请查看此处

这是一个很好的示例,不过我建议把它放在一个单独的文件中。 - Moshe
这似乎非常接近工作状态。下拉阴影需要下降到导航栏通常被截断的位置以下。我有这行代码 [image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height + 15.5)];,它给我的新导航栏图像正确的纵横比,但是下拉阴影被截断了。有没有办法使导航栏的“溢出”可见? - Erik Frisk
请看我回答的补充。 - Rad'Val
感谢mindnoise(以及其他所有人)的帮助。我使用了一些对您建议的轻微修改来解决这个特定的问题,但它引发了一个新的有趣问题。我已经在https://dev59.com/tG025IYBdhLWcg3wLipX上单独提出了这个问题。 - Erik Frisk

2
你可以在UINavigationBar上创建子类或分类,然后在initdrawRect方法中添加图像。如果你考虑一下,你正在尝试向导航栏添加阴影,而不是UITableView,所以修改Navbar而不是表格是有意义的。

1
我已经留下了两个版本,因为我发现有一些风格上的差异浮现出来。 - Moshe
@Moshe,我刚试过调用super方法,是可以的。请尝试下面这段代码: `@implementation UINavigationBar (ShadowBar)
  • (void)drawRect:(CGRect)rect { //画一个带阴影的导航栏 //UIImage *image = [UIImage imageNamed: @"UINavBarWithShadow.png"]; //[image drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; [super drawRect:rect]; } @end`
- Rad'Val
在类别中调用[super method]与在子类中调用[super method]不同...同意这一点。 - Rad'Val
1
其实,我认为这是一个好问题,所以我已经在Stack Overflow上提出了它。链接:https://dev59.com/KW025IYBdhLWcg3wLitX。 - Moshe
@GradyPlayer,@mindnoise感谢你们开始这个讨论,顺便说一句,我的另一个问题似乎做得很好。 :-) - Moshe
显示剩余22条评论

0

你正在将dropShadowView添加到self.view中,而在你的情况下,self.view是UITableViewController的视图。这意味着你的self.view是一个UITableView,所以当你上下滚动时,dropShadowView也会随之滚动,因为它在tableView内部。

尝试编写自定义UIViewController并添加两个子视图:一个是dropShadowView,另一个是你的表格。


0

0
不要将UITableView作为主视图,即view outlet,而是将其设置为包含UITableViewUIView,然后使您的控制器成为UIViewController的子类,并使其符合UITableViewDataSourceUITableViewDelegate。在您的nib中,设置您的视图,使其顶部有一个UIImageView,下面有一个UITableView。并将delegatedatasource设置为file's owner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接