使用静态 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 编写了以下演示应用程序: 文件-->新建项目。

这是我的故事板:

这是我在MyTableViewControllerviewDidLoad方法中写的代码:

- (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 中不会透明

当所有单元格都是静态的时将单元格添加到 UITableView(在情节提要中设计)

设置大标题时 UITableView 上方的灰色背景

5.静态控件背景透明化

MFC设置静态文本框背景为透明

UITableView 背景颜色设置两次