iPhone:使用尺寸等级

时间:2015-09-29 10:48:29

标签: ios swift xcode6

我放置了一个需要填充iPhone屏幕的背景图片。它在肖像视图中很好,但是当我旋转设备时,顶部被裁剪,这是我不想要的。 最好的似乎是纵向视图的图像和横向视图的图像。 我尝试使用尺寸类,为紧凑W分配1个图像,为任何W和紧凑H分配任何H和1.我无法使其工作。 我正在使用Xcode 6.3和swift 1.2。 我使用iOS 8 essentials(Neil Smyth)第24章中的说明创建了另一个应用程序,但它不起作用。我下载了文件" universal_images",以为我做错了什么但是它既不起作用。

4 个答案:

答案 0 :(得分:2)

这是我的问题的答案。

1 - 我在支持文件中添加了我的两张背景图片(一个横向版本和一个肖像版本),在一个名为“images”的组中(不是必需但更整洁)。

2 - 在Main.storyboard中,我添加了一个View(通过右下方的对象库),它出现在视图控制器场景中已存在的视图中。

3 - 在该视图中,我将图像视图放在编辑器中 - >图像视图 - >图像选择了肖像图像文件。视图 - >模式 - >填充方面

4 - 我通过图钉菜单0底部,顶部,左侧,右侧为容器视图和图像视图添加约束。

5 - 在ViewController类中的ViewController.swift中:UIViewController {......我添加了以下代码:

 override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
    if (toInterfaceOrientation.isLandscape) {
        println("Landscape");
        background.image = UIImage (named: "BeethovenH.png")
    }
    else {
        println("Portrait");
        background.image = UIImage (named: "BeethovenV.png")
    }
}

完美无缺。 谢谢你的帮助。

答案 1 :(得分:0)

我总是使用两个图像:一个用于纵向,一个用于横向,并且针对不同的目标具有不同的分辨率。这是保证您的背景在具有不同宽高比的不同设备上正常显示的最佳方式。

我总是将背景作为UIImageView包含在单独的UIView中。向所有边添加约束以将容器视图和图像视图固定到边缘。这可确保图像自动填充屏幕上的纵向和横向。

我有以下方法来设置给定方向的背景。它依赖于工厂类来加载适当的图像。加载背景需要比普通图像更多的努力,因为大小类不会告诉您有关宽高比的任何信息。用您用于加载适当图像的任何代码替换MyImageFactory

- (void) setBackgroundImage:(UIInterfaceOrientation) orientation{
    if (orientation == UIInterfaceOrientationLandscapeLeft ||
        orientation == UIInterfaceOrientationLandscapeRight)
    {
        NSLog(@"Setting background to landscape");
        [self.backgroundImageView setImage:[MyImageFactory backgroundImageLandscape]];
    }
    else{
        NSLog(@"Setting background to Portrait");
        [self.backgroundImageView setImage:[MyImageFactory backgroundImage]];
    }
}

调用viewWillAppear中的背景设置方法,将背景初始化为启动方向,如下所示:

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Set the background image
    [self setBackgroundImage:self.interfaceOrientation];
}

最后要处理旋转,请按如下方式覆盖旋转方法:

- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [self setBackgroundImage:toInterfaceOrientation];

    // Do anything else which is rotation specific.
}

在iOS7到iOS9上运行良好。

答案 2 :(得分:0)

我想这样做,我花了很长时间才找到解决方案的ios 11 / swift 4版本,所以我想我会在这里提供它。您按照上面的答案中给出的所有步骤,但代码是:

 func changeBackground() {
     //iPads etc
   if traitCollection.horizontalSizeClass == .regular{
    background.image = UIImage(named: "beethovenV.png")
   }
    else {  
            //compact width - most iPhones in portrait
           background.image = UIImage(named: "beethovenV.png")
            //iphone in landscape
           if traitCollection.verticalSizeClass == .compact{
             background.image = UIImage(named: "beethovenH.png")
            }
            }
}


override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
super.traitCollectionDidChange(previousTraitCollection)
changeBackground()
}

答案 3 :(得分:-1)

您需要执行简单的2个步骤 1.)为ipad和iphone的所有设备选择尺寸等级任意,它将在纵向和横向模式下运行。

2。)使用自动布局并设置约束,如屏幕截图enter image description here

所示

它会正常工作。谢谢