下载并安装最新版本的 Xcode。为您的应用设置启动屏幕文件(在目标设置的常规选项卡中)。这就是你如何使用任何屏幕的完整大小,包括 iOS 9 中的 iPad 拆分视图大小。测试你的应用程序,希望不要做任何其他事情,因为如果你正确设置了自动调整大小的蒙版,或者使用了 Auto,一切都会神奇地工作布局。如果没有,请调整视图布局,最好使用自动布局。如果您必须专门为较大的屏幕做一些事情,那么看起来您必须检查 [[UIScreen mainScreen] bounds] 的高度,因为似乎没有特定的 API。从 iOS 8 开始,还有一些尺寸类可以将屏幕尺寸抽象为垂直和水平的常规或紧凑型,建议采用这种方式来调整你的 UI。
如果你有一个为 iPhone 4S 或更早版本构建的应用程序,它会在 iPhone 5 上运行 letterboxed。
要使您的应用程序适应新的更高屏幕,您要做的第一件事是将启动图像更改为:Default-568h@2x.png。它的大小应为 1136x640 (HxW)。是的,在新的屏幕尺寸中使用默认图像是让您的应用程序占据整个新 iPhone 5 屏幕的关键。
(请注意,命名约定仅适用于默认图像。命名另一个图像“Image-568h@2x.png”不会导致加载它代替“Image@2x.png”。如果您需要加载不同的图像对于不同的屏幕尺寸,您必须以编程方式进行。)
如果您非常幸运,可能就是这样……但很可能,您将不得不采取更多步骤。
确保您的 Xibs/Views 使用自动布局来调整自己的大小。
使用弹簧和支柱来调整视图大小。
如果这对您的应用程序来说还不够好,请为一种特定的屏幕尺寸设计您的 xib/storyboard,并以编程方式为另一种屏幕尺寸重新定位。
在极端情况下(当以上都不满足时),设计两个 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
}
}
唯一真正需要做的事情是将名为“Default-568h@2x.png”的启动图像添加到应用程序资源中,并且在一般情况下(如果你足够幸运的话)应用程序将正常工作。
如果应用程序不处理触摸事件,请确保键窗口具有适当的大小。解决方法是设置正确的框架:
[window setFrame:[[UIScreen mainScreen] bounds]]
迁移到 iOS 6 时,还有其他与屏幕尺寸无关的问题。有关详细信息,请阅读 iOS 6.0 Release Notes。
有时(对于故事板之前的应用程序),如果布局将有很大不同,则值得根据设备指定不同的 xib(请参阅 this question - 您需要修改代码以处理 iPhone 5) viewController init,因为如果您需要不同的图形,那么再多的使用自动调整大小的蒙版也行不通。
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
NSString *myNibName;
if ([MyDeviceInfoUtility isiPhone5]) myNibName = @"MyNibIP5";
else myNibName = @"MyNib";
if ((self = [super initWithNibName:myNibName bundle:nibBundleOrNil])) {
...
这对于针对旧 iOS 版本的应用程序很有用。
在这里您可以找到一个很好的教程(对于 MonoTouch,但您也可以将这些信息用于非 MonoTouch 项目):
http://redth.info/get-your-monotouch-apps-ready-for-iphone-5-ios-6-today/
为您的初始/默认屏幕(640 x 1136 像素)创建一个名为“Default-568h@2x.png”的新图像 在 iOS 模拟器中,转到硬件 -> 设备菜单,然后选择“iPhone (Retina 4- inch)" 创建其他图像,例如背景图像 检测 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 = "-568h@2x";
public static UIImage FromBundle16x9(string path)
{
//adopt the -568h@2x 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());
}
}
通过XIB可以轻松迁移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];
}
我解决了这个问题here。只需在图像中添加 ~568h@2x 后缀,在 xib 中添加 ~568h。无需更多运行时检查或代码更改。
我添加了新的默认启动图像并(在查看其他几个 SE 答案时...)确保我的故事板都自动调整大小和子视图,但 4 英寸的视网膜仍然是信箱。
然后我注意到我的信息列表中有一个“启动图像”的行项目设置为“Default.png”,因此我将其删除并且神奇的信箱不再出现。希望这可以拯救其他人,就像我忍受的一样疯狂。
我想,它不会在所有情况下都有效,但在我的特定项目中,它避免了我重复 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...
}
在 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)
要确定您的应用程序是否可以支持 iPhone 5 Retina,请使用以下命令:(这可能更可靠地返回显示类型、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;
}
首先创建两个 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
文件
在单例类中尝试以下方法:
-(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";
}
您可以使用 Auto Layout
功能并使用 iPhone 5 屏幕分辨率创建设计,它适用于 4" 和 3.5" 设备,但在这种情况下,您应该对布局管理器有足够的了解。
在横向模式下检查 bounds
和 568
将失败。 iPhone 5 仅在纵向模式下启动,但如果您想支持旋转,那么 iPhone 5 的“检查”也需要处理这种情况。
这是一个处理方向状态的宏:
#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))
'preferredMode' 调用的使用来自我几个小时前阅读的另一篇文章,所以我没有想出这个想法。
首先显示此图像。在该图像中,您显示了对 Retina 4 支持的警告,因此单击此警告并单击添加,以便您的 Retina 4 启动屏幕自动添加到您的项目中。
https://i.stack.imgur.com/c7dez.png
使用此代码后:
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// For iphone 5
}
else
{
// For iphone 4 or less
}
我从来没有在任何设备上遇到过这样的问题,因为我有一个适用于所有人的代码库,没有任何硬编码值。我所做的是将最大尺寸的图像作为资源,而不是每个设备一个。例如,我将有一个用于视网膜显示并将其显示为适合纵横比的方式,因此它将是每台设备上的视图。例如,在运行时决定按钮的框架。为此,我使用专利视图的 % 值,例如,如果我希望宽度为父视图的一半,则取父视图的 50%,并且同样适用于高度和中心。
有了这个,我什至不需要 xibs。
您可以使用此定义来计算您是否使用基于屏幕尺寸的 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
}
彼得,你真的应该看看 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。
您可以手动检查屏幕尺寸以确定您使用的设备:
#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)
float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
// 4"
} else {
// 3"
}
您可以添加以下代码:
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
if ([[UIScreen mainScreen] respondsToSelector: @selector(scale)]) {
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 Resolution");
}
if(result.height == 1136) {
NSLog(@"iPhone 5 Resolution");
}
}
else{
NSLog(@"Standard Resolution");
}
}
UIScreen
上的 scale
选择器,并且您将遇到“标准分辨率”代码无法执行的情况。
这是一个真正的通用代码,您可以创建 3 个不同的故事板:
设置您的项目通用模式,并将您的主要故事 iPhone 设置为 iPhone5 故事板和 ipad 主故事板与 iPad 目标故事板,现在为 iphone 添加新的故事板目标并修改 iphone 4s 或更小的分辨率现在实现您的 AppDelegate.m
iPhone4/4s(与 3/3Gs 相同)一个用于 iPhone5 并使项目通用,并为 iPad 添加新的 Storyboard 目标,现在在 AppDelegate.m 的 didFinishLaunching
下添加以下代码:
if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone){
UIStoryboard *storyBoard;
CGSize result = [[UIScreen mainScreen] bounds].size;
CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width *scale, result.height *scale);
//----------------HERE WE SETUP FOR IPHONE4/4s/iPod----------------------
if(result.height == 960){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
//----------------HERE WE SETUP FOR IPHONE3/3s/iPod----------------------
if(result.height == 480){
storyBoard = [UIStoryboard storyboardWithName:@"iPhone4_Storyboard" bundle:nil];
UIViewController *initViewController = [storyBoard instantiateInitialViewController];
[self.window setRootViewController:initViewController];
}
}
return YES;
}
因此,您已经为 iPhone 3/3Gs/4/4s/5 All gen of iPod 和 All type iPad 创建了一个通用应用程序
请记住将所有 IMG 与 myImage.png
和 myImage@2x.png
集成
根据我的说法,处理此类问题并避免检查设备高度所需的几个条件的最佳方法是使用视图的相对框架或您添加到视图中的任何 UI 元素,例如:如果您正在添加您想要的一些 UI 元素应该位于视图底部或标签栏上方,那么您应该相对于视图的高度或相对于标签栏(如果存在)取 y 原点,我们也有自动调整大小的属性。我希望这对你有用
您可以使用屏幕大小自动调整视图大小,而不是使用一组条件。
int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));
在我的情况下,我想要一个视图来填充顶部的一些输入字段和底部的一些按钮之间的空间,因此根据屏幕大小固定左上角和可变右下角。我的应用程序用相机拍摄的照片填充图像视图,所以我想要我能得到的所有空间。
如果您需要将一个已经存在的应用程序转换为通用应用程序,您需要选择相应的 xib 文件->显示实用程序->显示大小检查器。
在 Size inspector 中你可以看到 Autosizing,通过使用这个工具你可以转换成现有的 iOS App。
使用 xCode 5,在 Project>General 上选择“Migrate to Asset Catalog”。
然后使用“在查找器中显示”找到您的启动图像,您可以将其虚拟编辑为 640x1136,然后将其拖到资产目录中,如下图所示。
确保 iOS7 和 iOS6 R4 部分都具有 640x1136 的图像。下次启动应用程序时,黑条将消失,您的应用程序将使用 4 英寸屏幕
https://i.stack.imgur.com/Ii62l.png
值得注意的一点 - 在新的 Xcode 中,您必须将此图像文件 Default-568h@2x.png 添加到资产
使用 Auto Layout
功能查看视图。它将自动调整为所有分辨率。
为控制器创建两个 xib,控制器名称带有后缀 ~iphone 或 ~ipad。在编译时,Xcode 会根据设备采用正确的 xib。
如果你想为 iPhone 和 iPad 创建一个单一的 xib,如果视图足够简单,可以移植到 iPhone 和 iPad,请使用 size classes。
在 iOS 设备和 iOS Simulator 上测试时都会出现一个小问题。似乎模拟器(XCode 6.0.1)根据设备方向在 [[UIScreen mainScreen] bounds].size
中提供了宽度和高度的切换值。
因此,在确定正确的物理屏幕尺寸时,这可能是一个问题。此代码还有助于区分所有 2014 年。iPhone 型号:
iPhone4s
iPhone5(和 iPhone5s)
iPhone6(和 iPhone6+)
它也可以很容易地改变,以区分 iPhone6 和 iPhone6+。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone)
{
if (iOSDeviceScreenSize.width > 568 || // for iOS devices
iOSDeviceScreenSize.height > 568) // for iOS simulator
{ // iPhone 6 and iPhone 6+
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone6
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone6" bundle:nil];
NSLog(@"loaded iPhone6 Storyboard");
}
else if (iOSDeviceScreenSize.width == 568 || // for iOS devices
iOSDeviceScreenSize.height == 568) // for iOS simulator
{ // iPhone 5 and iPod Touch 5th generation: 4 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone5
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone5" bundle:nil];
NSLog(@"loaded iPhone5 Storyboard");
}
else
{ // iPhone 3GS, 4, and 4S and iPod Touch 3rd and 4th generation: 3.5 inch screen (diagonally measured)
// Instantiate a new storyboard object using the storyboard file named Storyboard_iPhone4
storyboard = [UIStoryboard story boardWithName:@"MainStoryboard_iPhone" bundle:nil];
NSLog(@"loaded iPhone4 Storyboard");
}
}
else if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
{ // The iOS device = iPad
storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPadnew" bundle:nil];
NSLog(@"loaded iPad Storyboard");
}
// rest my code
}
我建议根据您的 UI 界面在您的应用程序中使用 Autoresizing Mask,它可以节省很多麻烦,并且比为 iPhone 4 和 5 屏幕制作不同的 UI 更好。