ios - mini2分辨率 - iphone 8屏幕比例




如何开发或迁移iPhone 5屏幕分辨率的应用程序? (20)

新的iPhone 5显示屏具有新的宽高比和新的分辨率(640 x 1136像素)。

开发新的或已有的应用程序到新的屏幕尺寸需要什么?

我们应该记住什么让应用程序对旧显示器和新宽屏高宽比具有“通用性”?


  1. 下载并安装最新版本的Xcode
  2. 为您的应用程序设置启动屏幕文件(在目标设置的常规选项卡中)。 这就是你如何使用任何屏幕的全尺寸,包括iOS 9中的iPad拆分视图尺寸。
  3. 测试你的应用程序,并希望别的什么都不要做,因为如果你已经正确设置了自动调整大小的掩码,或者使用了自动布局,所有东西都应该可以神奇地工作。
  4. 如果没有,请调整视图布局,最好使用自动布局。
  5. 如果您需要为大屏幕做某些事情,那么看起来您必须检查[[UIScreen mainScreen] bounds]高度,因为似乎没有特定的API。 从iOS 8开始,还有尺寸类别可将屏幕尺寸抽象为垂直和水平方向的常规或紧凑尺寸,并且是推荐的适应UI的方式。

如果您有为iPhone 4S或更早版本构建的应用程序,它将在iPhone 5上运行letterbox。

要使您的应用适应新的更高屏幕,首先要将启动图像更改为:[email protected]。 它的大小应该是1136x640(HxW)。 是的,在新的屏幕尺寸下显示默认图像是让您的应用程序获得全新iPhone 5屏幕的关键

(请注意,命名约定只适用于默认图像,命名另一个图像“[email protected]”不会导致它被加载,而不是“[email protected]”。如果您需要加载不同的图像对于不同的屏幕尺寸,您必须以编程方式执行此操作。)

如果你非常幸运,那可能是......但很可能, 你必须采取更多的步骤。

  • 确保你的Xibs / Views使用自动布局来调整自己的大小。
  • 使用弹簧和支柱来调整视图的大小。
  • 如果这对于您的应用程序来说不够好,请为您的xib / storyboard设计一个特定的屏幕大小,然后以编程方式为另一个屏幕大小重新定位。

在极端情况下(以上都不满足时),设计两个Xib并在视图控制器中加载相应的Xib。

检测屏幕尺寸:

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    CGSize result = [[UIScreen mainScreen] bounds].size;
    if(result.height == 480)
    {
        // iPhone Classic
    }
    if(result.height == 568)
    {
        // iPhone 5
    }
}

使用568检查bounds将在横向模式下失败。 iPhone 5仅在肖像模式下启动,但如果您想支持旋转,那么iPhone 5“检查”也需要处理这种情况。

这是一个处理方向状态的宏:

#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))

'preferredMode'电话的使用来自我在几个小时前阅读的另一篇文章,所以我没有提出这个想法。


使用xCode 5,在项目>常规上选择“迁移到资产目录”。

然后使用“在查找器中显示”来查找您的启动图像,您可以将其虚拟编辑为640x1136,然后将其拖到资产目录中,如下图所示。

确保iOS7和iOS6 R4部分的图像为640x1136。 下次启动应用程序时,黑条会消失,并且您的应用程序将使用4英寸的屏幕


唯一真正需要做的事情是将名为“[email protected]”的启动映像添加到应用程序资源中,并且在一般情况下(如果您足够幸运),该应用程序将正常工作。

如果应用程序不处理触摸事件,请确保关键窗口尺寸合适。 解决方法是设置适当的框架:

[window setFrame:[[UIScreen mainScreen] bounds]]

在迁移到iOS 6时,还有其他与屏幕大小无关的问题。有关详细信息,请阅读iOS 6.0发行说明


constants.h文件中,您可以添加这些定义语句:

 #define IS_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad 
 #define IS_IPHONE UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone
 #define IS_WIDESCREEN (fabs((double)[[UIScreen mainScreen] bounds].size.height - (double)568) < DBL_EPSILON) 
 #define IS_IPHONE_5 (!IS_IPAD && IS_WIDESCREEN)

在单例类中尝试下面的方法:

-(NSString *)typeOfDevice
    {
        if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
        {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            if(result.height == 480)
            {
                return @"Iphone";
            }
            if(result.height == 568)
            {
                return @"Iphone 5";
            }
        }
        else{
            return @"Ipad";;
        }


        return @"Iphone";
    }

在这里您可以找到一个很好的教程(对于MonoTouch,但您也可以将这些信息用于非MonoTouch项目):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/

  1. 为您的飞溅/默认屏幕( 640 x 1136像素 )创建一个名为“ [email protected] ”的新图像

  2. iOS模拟器中 ,进入硬件 - >设备菜单,并选择“ iPhone(Retina 4-inch)

  3. 创建其他图像,例如背景图像

  4. 检测iPhone 5加载您的新图像:
public static bool IsTall
{
    get {
        return UIDevice.currentDevice.userInterfaceIdiom
                    == UIUserInterfaceIdiomPhone
                && UIScreen.mainScreen.bounds.size.height
                    * UIScreen.mainScreen.scale >= 1136;
    }
}
private static string tallMagic = "[email protected]";
public static UIImage FromBundle16x9(string path)
{
    //adopt the [email protected] naming convention
    if(IsTall())
    {
        var imagePath = Path.GetDirectoryName(path.ToString());
        var imageFile = Path.GetFileNameWithoutExtension(path.ToString());
        var imageExt = Path.GetExtension(path.ToString());
        imageFile = imageFile + tallMagic + imageExt;
        return UIImage.FromFile(Path.Combine(imagePath,imageFile));
    }
    else
    {
        return UIImage.FromBundle(path.ToString());
    }
}

对视图使用Auto Layout功能。 它会自动调整到所有分辨率。

为控制器名称创建两个xib,后缀为〜iphone或〜ipad。 在编译时,Xcode将根据设备采用正确的xib。

如果视图足够简单以便移植到iPhone和iPad,则可以使用大小类,如果您想为iPhone和iPad创建单个xib。


彼得,你真的应该看看Canappi,它为你做了这一切,你只需要指定布局就可以了:

button mySubmitButton 'Sumbit' (100,100,100,30 + 0,88,0,0) { ... }

从那里Canappi将生成正确的objective-c代码,用于检测应用程序正在运行的设备并将使用:

(100,100,100,30) for iPhone4
(100,**188**,100,30) for iPhone 5

Canappi像Interface Builder和Story Board一样工作,除了它是文本形式。 如果你已经有XIB文件,你可以转换它们,所以你不必从头开始重新创建整个UI。


您可以使用屏幕大小自动调整视图的大小,而不是使用一组条件。

int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));

在我的情况下,我想要一个视图,填充顶部的一些输入字段和底部的一些按钮之间的空间,因此根据屏幕大小固定左上角和可变右下角。 我的应用程序使用相机拍摄的照片填充图像视图,所以我想要获得所有空间。


您可以使用此定义来计算您是否使用基于屏幕尺寸的iPhone 5:

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) < DBL_EPSILON )

然后使用一个简单的if语句:

    if (IS_IPHONE_5) {

    // What ever changes
    }

here解决这个问题。 只需在图像中添加〜568h @ 2x后缀,并在xib中添加〜568h。 不需要更多的运行时检查或代码更改。


我从来没有面对过任何设备的问题,因为我有一个代码库,没有任何硬编码值。 我所做的是将最大尺寸的图像作为资源,而不是每个设备一个。 例如,我将有一个用于视网膜显示并将其显示为方面适合,因此它将视为在每个设备上的视图。 例如,在运行时决定按钮的框架。 为此,我使用专利视图的%值,例如,如果我希望宽度为父视图的一半,请使用父视图的50%,同样适用于高度和中心。

有了这个,我甚至不需要xibs。


我建议根据您的UI界面在您的应用程序中使用Autoresizing Mask,它可以节省很多麻烦,并且比为iPhone 4和iPhone 5制作不同的UI更好。


我想,这不会在所有情况下都起作用,但在我的特定项目中,它避免了我复制NIB文件:

common.h某处,您可以根据屏幕高度进行这些定义:

#define HEIGHT_IPHONE_5 568
#define IS_IPHONE   ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
#define IS_IPHONE_5 ([[UIScreen mainScreen] bounds ].size.height == HEIGHT_IPHONE_5)

在您的基础控制器中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (IS_IPHONE_5) {
        CGRect r = self.view.frame;
        r.size.height = HEIGHT_IPHONE_5 - 20;
        self.view.frame = r;
    }
    // now the view is stretched properly and not pushed to the bottom
    // it is pushed to the top instead...

    // other code goes here...
}

根据我的观点,处理这些问题和避免检查设备高度所需的条件的最佳方法是使用相对框架来查看视图或添加到您的任何UI元素,例如:如果要添加你想要的一些UI元素应该在视图的底部或者在标签栏的上方,那么你应该根据你的视图的高度或者相对于标签栏(如果存在)采取y原点,并且我们也具有自动调整大小的属性。 我希望这会对你有用


要确定您的应用程序是否可以支持iPhone 5视网膜,请使用以下内容:((这可能会更加稳健以返回显示类型,4S Retina等),但是如下所示,如果iPhone支持iOS5 Retina作为是或否)

在一个常见的“.h”文件中添加:

BOOL IS_IPHONE5_RETINA(void);

在一个普通的“.m”文件中添加:

BOOL IS_IPHONE5_RETINA(void) {
    BOOL isiPhone5Retina = NO;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        if ([UIScreen mainScreen].scale == 2.0f) {
            CGSize result = [[UIScreen mainScreen] bounds].size;
            CGFloat scale = [UIScreen mainScreen].scale;
            result = CGSizeMake(result.width * scale, result.height * scale);

            if(result.height == 960){
                //NSLog(@"iPhone 4, 4s Retina Resolution");
            }
            if(result.height == 1136){
                //NSLog(@"iPhone 5 Resolution");
                isiPhone5Retina = YES;
            }
        } else {
            //NSLog(@"iPhone Standard Resolution");
        }
    }
    return isiPhone5Retina;
}

通过XIBs轻松移植iPhone5和iPhone4 .........

UIViewController *viewController3;
if ([[UIScreen mainScreen] bounds].size.height == 568)
{
    UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone5screen" bundle:nil] autorelease];               
}    
else
{
     UIViewController *viewController3 = [[[mainscreenview alloc] initWithNibName:@"iphone4screen" bundle:nil] autorelease];
}

首先创建两个xib并将所有代理,主类添加到xib ,然后您可以在您的appdelegate.m文件中将下面提到的这个条件放入

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

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

        self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone5" bundle:nil];
        }

        else
        {
             self.ViewController = [[ViewController alloc] initWithNibName:@"ViewControlleriphone4" bundle:nil];

        }

你甚至可以在你的ViewController类中根据你的需求在程序中的任何地方使用它。 最重要的是你已经为iphone 4(320*480) and iphone 5(320*568)创建了两个独立的xib文件,





iphone-5