0

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

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

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

这两个 640 像素 750 像素宽度的图像都是 2x,因此这不是简单地使用相同名称指定一个图像的 1x、2x 和 3x 版本的问题。

4

4 回答 4

4

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

正如您所描述的,我没有为每个尺寸变化创建一个图像集,而是为每个图像使用了两个图像集:一个包含 1x、2x、Retina 4" 2x 和 3x 的图像,如下所示:

在此处输入图像描述

一张用于 iPhone 6(Retina 4.7" 2x)图像,如下所示:

在此处输入图像描述

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

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

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

于 2014-09-25T23:13:13.713 回答
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。

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

这就是背景的样子。

在此处输入图像描述

于 2014-09-28T14:13:35.287 回答
1

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

于 2014-09-25T21:54:03.903 回答
0

在您的 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 )

在所有文件 .m 中,您现在可以将 if & else 用于任何功能:

  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"];
      }

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

希望这对您或其他人有所帮助

于 2014-11-11T16:00:39.837 回答