如何在Xcode中指定全屏背景图像,以便不在设备上安装冗余图像?

时间:2014-09-25 21:14:27

标签: ios uiimage iphone-6 iphone-6-plus

我正在Xcode 6中开发一个ObjC iPhone应用程序,目标是将iOS 7作为最低版本。

我的应用中的主UIViewController实例有全屏背景图片。该应用程序使用四个视觉主题,每个背景现在有三种尺寸。为了支持4英寸,4.7英寸和5.5英寸屏幕,图像宽度分别为640,750和1242像素。在我的项目中,我根据[[UIScreen mainScreen] nativeBounds]的结果选择特定图像来获取背景图像对应于屏幕分辨率。例如,background_gray(适用于640像素),background_gray_750background_gray_1242

有没有办法可以在Xcode xcassets包中安排我的所有背景图片,这样每个设备只能获得它将使用的背景图片?换句话说,像素宽度为750和1242像素的背景将永远不会在3.5英寸或4英寸屏幕上使用。

640像素750像素宽的图像都是2倍,所以这不是简单地使用相同的名称指定一个图像的1x,2x和3x版本。

4 个答案:

答案 0 :(得分:4)

我最近也面临这种情况,并思考为什么Apple没有在设备特定的图像集中包含Retina 4.7 2x选项。

我没有像你所描述的那样为每个尺寸变化创建一个图像集,而是每个图像使用两个图像集:一个包含1x,2x,Retina 4和#34的图像;像这样的2x和3x:

enter image description here

一个用于iPhone 6(Retina 4.7和#34; 2x)的图像,如下所示:

enter image description here

这样我只需要检查与iPhone 6匹配的屏幕宽度,如下所示:

CGFloat screenWidth = CGRectGetWidth([UIScreen mainScreen].nativeBounds);
NSString *imageName = (screenWidth == 750.0) ? @"Image~750" : @"Image";
UIImage *image = [UIImage imageNamed:imageName];

上述三元运算符中的错误条件是指操作系统从上面的第一个图像集中选择要显示的正确图像。

答案 1 :(得分:1)

不,对于iPhone 4到iPad的所有设备,只有一个应用程序包分发到商店。此捆绑包需要保存所有设备的图像。

答案 2 :(得分:1)

我在商店里有27个应用程序,并且不想为每个应用程序创建和管理新的背景。而且我怀疑将来会有更多尺寸。所以我所做的是为每个应用程序创建一个1800x1800的图像。它们大多在300-400KB左右。它对我有用,因为图像周围有很多空白区域。我基本上把一个方形图像放在屏幕的中央。如果要填满整个屏幕,则此方法不起作用。然后在viewWillAppear中我调用这个方法。

- (void)pickBackgroundImage {

    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGFloat scale = [UIScreen mainScreen].scale;
    CGPoint midPoint = [Utilities findMidpoint:self.view];

    NSString *pictFile = [[NSBundle mainBundle] pathForResource:@"Background" ofType:@"png"];
    UIImage *imageToDisplay = [UIImage imageWithContentsOfFile:pictFile];
    imageToDisplay  = [UIImage imageWithCGImage:imageToDisplay.CGImage scale:scale orientation:imageToDisplay.imageOrientation];

    CGRect pictFrame;
    if(orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
        CGFloat imageWidth = (unsigned int)(.9f * self.view.frame.size.width);
        pictFrame = CGRectMake(midPoint.x - imageWidth/2, midPoint.y - imageWidth/2, imageWidth, imageWidth);
        pictFrame.origin.y = self.view.frame.origin.y + .3f * pictFrame.origin.y;
    } else {
        CGFloat imageWidth = (unsigned int)(self.view.frame.size.height - 20 - 44);
        pictFrame = CGRectMake(midPoint.x - imageWidth/2, midPoint.y - imageWidth/2, imageWidth, imageWidth);
        pictFrame.origin.y = 10;
    }
    self.BGView = [[UIImageView alloc] initWithImage:imageToDisplay];
    self.BGView.frame = pictFrame;
    self.BGView.contentMode = UIViewContentModeScaleAspectFit;

    [self.view insertSubview:self.BGView atIndex:0];
}

算法有点棘手,但基本上我弄清楚屏幕有多大,然后减去菜单栏和底栏。然后填充90%的图像剩余部分。我使用比例因子CGFloat scale = [UIScreen mainScreen] .scale ;,使设备认为图像是为它创建的,例如@ 2x或@ 3x。

适用于所有设备的模拟器。我没有新手机,所以我还没能在它上面进行测试。

这就是背景。

enter image description here

答案 3 :(得分:1)

在你的prefix.pch中定义分辨率:

    #endif
    #define   IsIphone6     ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )667 ) < DBL_EPSILON )
    #define   IsIphone5     ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )
    #define   IsIphone4     ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )480 ) < DBL_EPSILON )
    #define   IsIphone6Plus     ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )736 ) < DBL_EPSILON )

在你的所有文件中。现在你可以使用if&amp;其他任何功能:

  if (IsIphone6Plus) {

      bg.image = [UIImage imageNamed:@"bg6plus.png"];

  } else if (IsIphone6){

      bg.image = [UIImage imageNamed:@"bg6.png"];

  } else if (IsIphone5) {

      bg.image = [UIImage imageNamed:@"bg5.png"];

  } else if (IsIphone4) {

       bg.image = [UIImage imageNamed:@"bg4.png"];


  } else {

       bg.image = [UIImage imageNamed:@"ipad.png"];
  }

例如,如果5/6和6plus的图像相同,则可以使用:

 if (IsIphone5||IsIphone6||IsIphone6Plus) {

          bg.image = [UIImage imageNamed:@"bg.png"];

      } else if (IsIphone4) {
           bg.image = [UIImage imageNamed:@"bg4.png"];
      } else {

           bg.image = [UIImage imageNamed:@"ipad.png"];
      }

这对于按钮位置的所有示例都有效,滚动视图的尺寸为

希望这可以帮助你或其他人