-->

iOS 6中的应用程序 - 如何应对iPhone 5的屏幕尺寸? [重复](iOS 6 apps

2019-09-22 08:51发布

可能重复:
如何开发或迁移为iPhone 5的屏幕分辨率的应用程序?

我只是用我们应该如何应对iPhone 5更大的屏幕尺寸疑惑。

由于它具有高度更多的像素,诸如此类GCRectMake使用坐标(和原来的2倍与视网膜/非视网膜问题像素)将不会版本之间无缝地工作,因为它发生的时候,我们得到了视网膜 。

而将我们要设计两个故事板,就像为iPad?

我个人不认为苹果会要求你每次你要画的东西,像很多答案说的时间来检查的屏幕尺寸。 这是否与iPad发生的呢?

Answer 1:

所有的应用程序将继续从我能在今天的演讲告诉在垂直拉伸的屏幕工作。 他们将遮幅式或基本高度额外的88分,简直是黑色的。

如果你只打算支持的iOS 6+,那么肯定会考虑使用自动布局。 它消除了所有固定布局的处理,而是使用限制打下的事情了。 什么都不会被硬编码,和你的生活将变得非常简单。

但是,如果你要支持旧的iOS的,那么它真的取决于你的应用程序。 大多数的使用标准的导航栏,和/或标签栏的应用程序,可以简单地扩大中间的内容使用了该加分。 设置中心内容的自动尺寸面具在两个方向拓展。

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

它的伟大工程开箱即用的表视图,但是,如果你的应用程序中使用像素完美的布局显示内容,那么你最好的选择将是重新想象的内容,以便它可以适应不同的高度。

如果这不是一个可能性,那么剩下的唯一选择就是有两个用户界面(预iPhone 5和iPhone 5)。

如果这听起来有点丑,那么你可以使用默认的信箱模型,其中加分/像素只显示了黑去。

编辑

为了使您的应用程序与iPhone 5的工作,你需要添加启动图像的视网膜版本。 它应该被命名为Default-568h@2x.png 。 而且它必须是视网膜质量 - 这里没有向后兼容性:)

你也可以从在Xcode中选择此图像。 转至目标,并在摘要部分,寻找发射图像。 该图像具有在尺寸640x1136像素。 下面是在哪里找到它的截图,有没有什么帮助。



Answer 2:

您需要添加一个640x1136像素PNG图像( Default-568h@2x.png )作为项目的一个4英寸的默认开机画面,它会使用额外的空间(没有工作简单的基于表格的应用程序,游戏将需要更多的努力) 。

我为了对付所有的屏幕分辨率创建了一个小的UIDevice类。 你可以在这里得到它 ,但代码如下:

文件的UIDevice + Resolutions.h:

enum {
    UIDeviceResolution_Unknown           = 0,
    UIDeviceResolution_iPhoneStandard    = 1,    // iPhone 1,3,3GS Standard Display  (320x480px)
    UIDeviceResolution_iPhoneRetina4    = 2,    // iPhone 4,4S Retina Display 3.5"  (640x960px)
    UIDeviceResolution_iPhoneRetina5     = 3,    // iPhone 5 Retina Display 4"       (640x1136px)
    UIDeviceResolution_iPadStandard      = 4,    // iPad 1,2,mini Standard Display   (1024x768px)
    UIDeviceResolution_iPadRetina        = 5     // iPad 3 Retina Display            (2048x1536px)
}; typedef NSUInteger UIDeviceResolution;

@interface UIDevice (Resolutions)

- (UIDeviceResolution)resolution;

NSString *NSStringFromResolution(UIDeviceResolution resolution);

@end

文件的UIDevice + Resolutions.m:

#import "UIDevice+Resolutions.h"

@implementation UIDevice (Resolutions)

- (UIDeviceResolution)resolution
{
    UIDeviceResolution resolution = UIDeviceResolution_Unknown;
    UIScreen *mainScreen = [UIScreen mainScreen];
    CGFloat scale = ([mainScreen respondsToSelector:@selector(scale)] ? mainScreen.scale : 1.0f);
    CGFloat pixelHeight = (CGRectGetHeight(mainScreen.bounds) * scale);

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
        if (scale == 2.0f) {
            if (pixelHeight == 960.0f)
                resolution = UIDeviceResolution_iPhoneRetina4;
            else if (pixelHeight == 1136.0f)
                resolution = UIDeviceResolution_iPhoneRetina5;

        } else if (scale == 1.0f && pixelHeight == 480.0f)
            resolution = UIDeviceResolution_iPhoneStandard;

    } else {
        if (scale == 2.0f && pixelHeight == 2048.0f) {
            resolution = UIDeviceResolution_iPadRetina;

        } else if (scale == 1.0f && pixelHeight == 1024.0f) {
            resolution = UIDeviceResolution_iPadStandard;
        }
    }

    return resolution;
 }

 @end

这就是你需要使用这个代码。

1)以上的UIDevice + Resolutions.h及的UIDevice + Resolutions.m文件添加到您的项目

2)行#进口“的UIDevice + Resolutions.h”添加到您的ViewController.m

3)添加此代码来检查你正在处理的是什么版本的设备

int valueDevice = [[UIDevice currentDevice] resolution];

    NSLog(@"valueDevice: %d ...", valueDevice);

    if (valueDevice == 0)
    {
        //unknow device - you got me!
    }
    else if (valueDevice == 1)
    {
        //standard iphone 3GS and lower
    }
    else if (valueDevice == 2)
    {
        //iphone 4 & 4S
    }
    else if (valueDevice == 3)
    {
        //iphone 5
    }
    else if (valueDevice == 4)
    {
        //ipad 2
    }
    else if (valueDevice == 5)
    {
        //ipad 3 - retina display
    }


Answer 3:

我刚刚完成更新和发送的iOS 6.0版本,我的应用程序商店之一。 这个版本是与iOS 5.0向后兼容的,因此,我保持shouldAutorotateToInterfaceOrientation:方法和添加的新的,列出如下。

我必须做到以下几点:

自转是在IOS 6改变在iOS 6中,所述shouldAutorotateToInterfaceOrientation: UIViewController中的方法已被弃用。 在其位,你应该使用supportedInterfaceOrientationsForWindow:shouldAutorotate方法。 因此,我添加这些新方法(并保持旧的iOS 5兼容性):

- (BOOL)shouldAutorotate {
    return YES;
}

- (NSUInteger)supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskAllButUpsideDown;    
}
  • 所使用的视图控制器的viewWillLayoutSubviews方法和调整使用所述视图的边界矩形的布局。
  • 模态视图控制器:willRotateToInterfaceOrientation:duration:
    willAnimateRotationToInterfaceOrientation:duration: ,和
    didRotateFromInterfaceOrientation:方法不再调用的任何视图控制器,在使全屏幕演示
    本身 -例如, presentViewController:animated:completion:
  • 然后,我固定自动版式为需要它的意见。
  • 从模拟器启动看法和观点在iTunes Store到Photoshop中的复制影像,并远销他们为PNG文件。
  • 默认图像的名称是: Default-568h@2x.png ,尺寸为640×1136。 It's还允许对于相同的肖像模式(状态条移除)提供640×1096。 类似的尺寸也可以在横向模式下提供的,如果您的应用程序只允许在iPhone上的横向。
  • 我已经下降向后兼容于iOS 4。造成这种情况的原因主要是因为支持armv6代码已被删除。 因此,我能够支持现在(正在运行的所有设备armv7 )可以升级到iOS 5。
  • 我也代armv7s代码支持iPhone 5,因此不能使用任何第三方框架(如AdMob联播等),直到它们被更新。

这就是全部,但只记得测试自转中的iOS 5和iOS 6,因为在旋转的变化。



Answer 4:

没有。

if ([[UIScreen mainScreen] bounds].size.height > 960)

关于iPhone 5的是错误的

if ([[UIScreen mainScreen] bounds].size.height == 568)


Answer 5:

@interface UIDevice (Screen)
typedef enum
{
    iPhone          = 1 << 1,
    iPhoneRetina    = 1 << 2,
    iPhone5         = 1 << 3,
    iPad            = 1 << 4,
    iPadRetina      = 1 << 5

} DeviceType;

+ (DeviceType)deviceType;
@end

.M

#import "UIDevice+Screen.h"
@implementation UIDevice (Screen)

+ (DeviceType)deviceType
{
    DeviceType thisDevice = 0;
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        thisDevice |= iPhone;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
        {
            thisDevice |= iPhoneRetina;
            if ([[UIScreen mainScreen] bounds].size.height == 568)
                thisDevice |= iPhone5;
        }
    }
    else
    {
        thisDevice |= iPad;
        if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)])
            thisDevice |= iPadRetina;
    }
    return thisDevice;
}

@end

这样,如果要检测它是否只是一个iPhone或iPad(无论屏幕大小),你只需使用:

if ([UIDevice deviceType] & iPhone) 

要么

if ([UIDevice deviceType] & iPad)

如果要检测只是iPhone 5,你可以使用

if ([UIDevice deviceType] & iPhone5)

相对于Malcoms答案在你需要只是检查弄清楚,如果它是一个iPhone,

if ([UIDevice currentResolution] == UIDevice_iPhoneHiRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneStandardRes || 
    [UIDevice currentResolution] == UIDevice_iPhoneTallerHiRes)`

无论是方式有一个很大的优势彼此,它仅仅是一个个人喜好。



Answer 6:

@帕斯卡尔的任择议定书的问题,意见是正确的。 通过简单地将图像,它消除了黑色边框和应用程序将使用完整的高度。

您将需要通过确定该设备使用更大的显示屏来调整任何CGRects。 也就是说,如果你需要的东西排列在屏幕的底部。

我相信有一个内置的方法,但是我还没有看到任何东西,很多仍然是保密协议,所以我们在我们的应用程序使用的方法是很简单的全局函数。 以下内容添加到您的.PCH文件,然后它的一个简单if( is4InchRetina() ) { ... }调用来调整你的CGRects等。

static BOOL is4InchRetina()
{
    if (![UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 548 || [UIApplication sharedApplication].statusBarHidden && (int)[[UIScreen mainScreen] applicationFrame].size.height == 568)
        return YES;

    return NO;
}


Answer 7:

我想你可以使用[UIScreen mainScreen].bounds.size.height并计算你的对象一步。 当你计算步骤中,您可以为两种分辨率设定坐标。

或者你可以得到高度类似上面和if(iphone5) then... else if(iphone4) then... else if(ipad) 事情是这样的。

如果您使用的故事板,那么你必须为新的iPhone我想创造新的。



Answer 8:

由于它具有高度像素越多,像GCRectMake的东西,用坐标将不完美的版本之间的工作,因为它发生的时候,我们得到了视网膜。

好了,他们的工作一样具有Retina显示屏-它只是1个单位在CoreGraphics中的坐标系将对应于2个物理像素,但你不/没有做任何事情,逻辑保持不变。 (你有没有真的试图运行你的视网膜上的iPhone非Retina的应用程序之一, 永远不会消失?)

对于实际的问题:这就是为什么你不应该使用明确的CGRectMakes和合作......这就是为什么你有这样的东西[[UIScreen mainScreen] applicationFrame]



文章来源: iOS 6 apps - how to deal with iPhone 5 screen size? [duplicate]