使用静态 UITableView 时将透明背景设置为 UINavigationBar 会导致过渡效果不佳
Posted
技术标签:
【中文标题】使用静态 UITableView 时将透明背景设置为 UINavigationBar 会导致过渡效果不佳【英文标题】:Setting transparent background to UINavigationBar cause to bad transition effect when using static UITableView 【发布时间】:2013-12-06 15:59:35 【问题描述】:我正面临这种奇怪的情况,我想要一个透明的UINavigationBar
,但由于某种原因,从一个屏幕到另一个屏幕的转换并不顺利。在另一个屏幕上,我有这个静态的UITableView
,我用storyboard
进行了配置。在转换时,它会一直显示上一个屏幕,直到下一个屏幕终于出现。
为了重现此问题,我使用 Xcode 5 编写了以下演示应用程序:
文件-->新建项目。
这是我的故事板:
这是我在MyTableViewController
的viewDidLoad
方法中写的代码:
- (void)viewDidLoad
[super viewDidLoad];
NSString *bgName = @"bg.jpg";
// those lines are for making transparent navigation bar
[self.navigationController.navigationBar setBackgroundImage:[UIImage new]
forBarMetrics:UIBarMetricsDefault];
self.navigationController.navigationBar.shadowImage = [UIImage new];
// those lines for the background of the table view and its container
self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:bgName]];
self.tableView.backgroundColor = [UIColor clearColor];
我从我的根视图控制器开始:
按下按钮后(在故事板中配置为推送MyTableViewController
,这是我面临的问题:
终于有了我想要的屏幕,带有透明UINavigationBar
的静态表格:
如果缺少任何进一步的相关数据,请发表评论,以便您帮助我。
感谢您的帮助,
干杯!
编辑 - @Greg 回答
我也尝试了以下方法,它可以防止转换问题,但我的 UINavigationBar
是半透明的,不是 100% 透明
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"mystatic"])
MyTableViewController *viewController = (MyTableViewController*)segue.destinationViewController;
NSString *bgName = @"bg.jpg";
[viewController.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault];
viewController.navigationController.navigationBar.shadowImage = nil;
// I have also tried this
// [self.navigationController.navigationBar setBackgroundImage:nil
// forBarMetrics:UIBarMetricsDefault];
// self.navigationController.navigationBar.shadowImage = nil;
viewController.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:bgName]];
【问题讨论】:
【参考方案1】:你打电话给[UIImage new]
吗?您应该改为调用 nil 。您能否将此代码从 viewDidLoad 方法移动到您的 RootVC 并在 prepareForSegue 中:为您的 destinationController 设置它:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
if ([segue.identifier isEqualToString:@"YOURIDENTIFIER"])
MyTableViewController *viewController = (MyTableViewController*)segue.destinationViewController;
[viewController.navigationController.navigationBar setBackgroundImage:...
//If it doesn't work try
[self.navigationController.navigationBar setBackgroundImage:...
// But when you pop to root view controller you have to change navigation bar back to match you root view controller design
//rest of your code here
试试看,让我知道它对你有用。
【讨论】:
我在 if 条件下得到segue.identifier = null
。回想一下,通过情节提要配置的按钮,而不是通过编码
根视图控制器和我在故事板中的表格之间存在一个segue。点击它并设置一个名字,如果你不确定,你可以谷歌。
哦...抱歉,我不小心把 ID 放到了错误的组件上。无论如何,它没有工作。请查看我的编辑和您的回答 - 也许我做错了什么?【参考方案2】:
同样的问题发生在我身上,UIView(它是一个 UIImageView)的背景在转换过程中是卷曲的。我可以解决的方法是使用:
self.view.clipToBounds = true
或在 IB (Identity Inspector) 中,检查剪辑子视图、ViewController 的视图。
在我的情况下,图像非常大,必须占据整个屏幕(上、下、左、右),显然当过渡溢出并试图占据它时。
【讨论】:
以上是关于使用静态 UITableView 时将透明背景设置为 UINavigationBar 会导致过渡效果不佳的主要内容,如果未能解决你的问题,请参考以下文章
分组 UITableView 的背景颜色在 iOS7 中不会透明