为整个iOS应用设置背景图像

6
我正在尝试设置整个应用程序的背景图像,遵循此建议:set background image for entire iPhone / iPad app。但在iOS 7中(不知道其他版本),它根本不起作用。我创建了一个简单的存储库,以便您更好地了解发生了什么。转换中存在一些问题。当您在第一个视图中点击一行时,第二个视图将被推入导航控制器,但会出现奇怪的效果。似乎行的透明度也参与了其中。另一个问题是当您返回到之前的视图控制器时,弹出导航堆栈的视图控制器会有一个微妙的阴影。正如我之前所说,您可以通过运行简单的Xcode项目来理解我的意思。任何想法?我已经尝试为每个控制器设置背景图像,但这不是我想要的,因为这样图片会“重叠”在先前的背景图像上,这不是期望的效果。希望我解释得清楚。存储库:https://github.com/socksz/FixedBackgroundImage编辑1 看起来问题是由于iOS 7在两个视图控制器之间的转换方式导致的。如果你在第二个视图控制器中并尝试使用滑动手势返回到上一个控制器,你会发现当你开始手势时,第一个控制器会出现在第二个控制器下面(你正在看到的控制器),由于UITableViewCell具有透明背景,所以你已经看到了第一个控制器。实际上,我担心这没有解决方案。真遗憾我不能有一个固定的背景图片,而不必在每个控制器上设置背景图片。

enter image description here


你有看过 appearanceWhenContainedIn:appearance 方法吗? - Popeye
@Popeye 是用于什么目的?你能给我更多细节吗?谢谢! - Fred Collins
使用 appearanceWhenContainedIn: 可以让你为所有包含在 UIViewController 类中的 UITableViews 设置外观,例如 backgroundColor:。或者,你可以使用普通的外观方法来设置应用程序中每个 UIView 的背景图像 backgroundImage: - Popeye
谢谢 Popeye,但这不是我的问题。我想要实现的是有一张固定的背景图片,始终呈现在表视图下方。如果我使用 appearanceWhenContainedIn: 为表视图设置背景图片,那与在每个视图控制器中设置背景图片是一样的效果。 - Fred Collins
7个回答

7

我在一个iPhone应用程序中有这样的需求:根据用户的偏好设置页面背景图像。我处理的方法是将带有背景图像的UIImageView作为子视图添加到视图中,就像这样 -

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background-image"]];
bgImageView.frame = self.view.bounds;
[self.view addSubview:bgImageView];
[self.view sendSubviewToBack:bgImageView];

我克隆了你的Github存储库,并在两个视图控制器的viewDidLoad中添加了上述代码片段。我还在同一方法中添加了以下代码行 -

self.tableView.opaque = NO;

我将在didFinishLaunchingWithOptions中注释掉设置背景颜色的代码。这些更改后,在视图控制器之间导航时的伪像已经消失。我测试了iPhone Retina(3.5英寸)和iPhone Retina(4英寸)模拟器。

为什么在从Storyboard导航到ViewController并返回时会出现伪像,需要进行一些调查。我的建议可能适用于您的要求,但是您可以尝试将其作为解决方案。

P.S. 该方法需要对自动布局约束进行一些微调。


5
你只需要在AppDelegate.m文件的applicationDidFinishLaunchingWithOptions:方法中写一行代码。
[self.window setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"MainBackground.png"]]];

并在每个屏幕的viewDidLoad方法中添加以下行:

[self.view setBackgroundColor:[UIColor clearColor]];

我不知道你的情况,但在我的iOS7上,这段代码是有效的。 - Haresh Ghatala
你在试过仓库里的代码吗?这个代码是可以运行的,我的意思是图片会作为背景出现。问题在于当推入/弹出控制器时的视觉效果。 - Fred Collins
现在使用推送/弹出控制器进行测试,它运行良好。 - Haresh Ghatala
我也做了同样的事情。你介意把你的测试项目推送到一个仓库或者压缩成zip文件吗? - Fred Collins
这正是我尝试过的,但我使用了表视图而不是普通视图。 - Fred Collins
显示剩余2条评论

2

我没有找到一种全局设置的方法。不过,对于静态/固定图像(而不是当设置backgroundColor属性时得到的移动图像),对每个屏幕使用backgroundView属性可能会很有用。

self.tableView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background.jpg"]];

我通过创建一个UtilTableViewController来实现自己的需求,包括主题和自定义功能,将代码放在那里,然后再对所有视图进行子类化。它不是全局设置的图像,但我只需要设置一次,所有的TableViews都将使用它。


1

晚点发布...

如果您正在使用NavigationController,您可以尝试覆盖TopViewController的“get”部分,自动将BackGroundColor设置为您的图像。抱歉,我们使用Xamarin将其从C#转换为Objective C(不确定具体语法)。在C#中,它将在您的NavigationController类中看起来像这样。

    public override UIViewController TopViewController
{
  get
  {
    if (base.TopViewController.View.BackgroundColor != "Your Image")
    {
      base.TopViewController.View.BackgroundColor = "Your Image";
    }
    return base.TopViewController;
  }
}

1
将此代码放在您的appdelegate.m文件的applicationDidFinishLaunching方法中。
UINavigationController *navigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];   

     windowBackground=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"background_window.png"]];
                windowBackground.frame=CGRectMake(0, 0, 320, 568);
                [window addSubview:windowBackground];
                [windowBackground release];

            window.frame = CGRectMake(0, 0, window.frame.size.width,568);

            [window addSubview:[navigationController view]];
            [window makeKeyAndVisible];

在每个视图控制器的viewDidLoad方法中添加此代码。

self.view.backgroundColor = [UIColor clearColor];

0
请在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中编写此代码。
 UIColor *background = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"YourImageName.png"]];
 self.window.backgroundColor = background;

0

您可以通过以下代码设置背景图像...我们可以将此代码放在viewcontroller.m文件的viewdidload方法中

[self.window setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"bg.png"]]];


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