iOS 6应用-如何处理iPhone 5屏幕尺寸?[重复]

2020/10/31 23:22 · ios ·  · 0评论

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

我只是想知道我们应该如何处理更大屏幕的iPhone 5。

随着高度的增加,像GCRectMake这样使用坐标的东西(由于视网膜/非视网膜问题使像素增加了一倍)将无法在版本之间无缝运行,就像我们获得Retina时那样

就像iPad一样,我们是否必须设计两个故事板?

我个人不认为Apple会在每次需要绘制东西时要求您检查屏幕尺寸,就像许多答案所说的那样。iPad会发生这种情况吗?

根据我在今天的演讲中所讲的,所有应用程序将继续在垂直拉伸的屏幕上工作。它们将被加信箱,或者基本上多余的88个高度将完全是黑色的。

如果您仅打算支持iOS 6+,那么绝对可以考虑使用“自动布局”。它删除了所有固定的布局处理,而是使用约束对事物进行布局。一切都不会被硬编码,您的生活将变得更加简单。

However, if you have to support older iOS's, then it really depends on your application. A majority of applications that use a standard navigation bar, and/or tab bar, could simply expand the content in the middle to use up that extra points. Set the autoresizing mask of the center content to expand in both directions.

view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

It works great out of the box for table views, however, if your app used pixel-perfect layout for displaying content, then your best bet would be to re-imagine the content so that it can accommodate varying heights.

If that's not a possibility, then the only remaining option is to have two UIs (pre iPhone 5, and iPhone 5).

If that sounds ugly, then you could go with the default letterboxed model where the extra points/pixels just show up black.

Edit

To enable your apps to work with iPhone 5, you need to add a retina version of the launcher image. It should be named Default-568h@2x.png. And it has to be retina quality - there's no backward compatibility here :)

You could also select this image from within Xcode. Go to the target, and under the Summary section, look for Launch Images. The image has to be 640x1136 pixels in size. Here's a screenshot of where to find it, if that helps.

Xcode屏幕截图

您需要添加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)将行#import“ 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
    }

我刚刚完成更新并将其中一个应用程序的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商店的视图复制到PhotoShop中,并将其导出为png文件。
  • 默认图像的名称为:Default-568h@2x.png,尺寸为640×1136。还可以为相同的肖像模式提供640×1096(已删除状态栏)。如果您的应用仅允许在iPhone上横向放置,则在横向模式下也可以提供类似的尺寸。
  • 我已经放弃了对iOS 4的向后兼容性。其主要原因是因为对armv6代码的支持已被删除。因此,我现在能够支持(运行armv7)的所有设备都可以升级到iOS 5。
  • 我还生成了支持iPhone 5的armv7s代码,因此在更新之前不能使用任何第三方框架(如Admob等)。

仅此而已,因为旋转的变化,请记住要在iOS 5和iOS 6中测试自动旋转。

没有。

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

在iPhone 5上是错误的

if ([[UIScreen mainScreen] bounds].size.height == 568)
@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

This way, if you want to detect whether it is just an iPhone or iPad (regardless of screen-size), you just use:

if ([UIDevice deviceType] & iPhone) 

or

if ([UIDevice deviceType] & iPad)

If you want to detect just the iPhone 5, you can use

if ([UIDevice deviceType] & iPhone5)

As opposed to Malcoms answer where you would need to check just to figure out if it's an iPhone,

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

Neither way has a major advantage over one another, it is just a personal preference.

@Pascal对OP问题的评论是正确的。通过简单地添加图像,它可以消除黑色边框,并且应用程序将使用完整的高度。

您需要通过确定设备使用的是更大的显示屏来对所有CGRect进行调整。即,如果您需要与屏幕底部对齐的内容。

我确定有一个内置的方法,但是我什么都没看到,而且NDA仍然很多,因此我们在应用程序中使用的方法只是一个全局函数。将以下内容添加到您的.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;
}

我认为您可以使用[UIScreen mainScreen].bounds.size.height和计算对象的步骤。在计算步长时,您可以设置两个分辨率的坐标。

或者你可以像上面和上面那样获得身高if(iphone5) then... else if(iphone4) then... else if(ipad)这样的事情。

我认为,如果使用情节提要,则必须为新iPhone创建新的情节提要。

随着高度的增加,像GCRectMake这样使用坐标的东西在版本之间将无法无缝运行,就像我们获得视网膜时那样。

那么,他们的工作一样具有Retina显示屏-它只是1个单位在CoreGraphics中的坐标系将对应于2个物理像素,但你不/没有做任何事情,逻辑保持不变。(您是否曾经尝试过在视网膜iPhone上运行您的非视网膜应用之一?

对于实际的问题:这就是为什么您不应该使用显式的CGRectMakes和co ...这就是为什么您拥有诸如之类的东西的原因[[UIScreen mainScreen] applicationFrame]

本文地址:http://ios.askforanswer.com/ios-6yingyong-ruhechuliiphone-5pingmuchicunzhongfu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!