新款iPhone 5显示器具有全新的宽高比和新的分辨率(640 x 1136像素)。
将新的或已转换的现有应用程序开发到新的屏幕尺寸需要什么?
我们应该记住什么才能使应用程序对于较旧的显示器和新的宽屏宽高比都具有“通用性”?
答案 0 :(得分:479)
[[UIScreen mainScreen] bounds]
的高度,因为似乎没有特定的API。从iOS 8开始,还有一些大小类可以将屏幕尺寸纵向和横向抽象为常规或紧凑,并且是推荐用于调整UI的方法。答案 1 :(得分:116)
如果您有适用于iPhone 4S或更早版本的应用,它将在iPhone 5上运行letterbox。
要使您的应用适应新的更高屏幕,您要做的第一件事就是将启动图像更改为:Default-568h@2x.png。它的大小应该是1136x640(HxW)。 是的,在新屏幕尺寸中使用默认图像是让您的应用程序占据整个新iPhone 5屏幕的关键。
(请注意,命名约定仅适用于默认图像。命名另一个图像“Image-568h@2x.png”不会导致它被加载以代替“Image@2x.png”。如果你需要为不同的屏幕尺寸加载不同的图像,你必须以编程方式进行。)
如果你非常幸运,可能就是这样......但很有可能,你将不得不采取更多措施。
在极端情况下(当上述情况都不足时),设计两个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
}
}
答案 2 :(得分:30)
唯一真正需要做的是将一个名为“Default-568h@2x.png”的启动图像添加到应用程序资源中,一般情况下(如果你足够幸运的话)该应用程序将正常工作。
如果应用不处理触摸事件,请确保键窗口的大小合适。解决方法是设置正确的框架:
[window setFrame:[[UIScreen mainScreen] bounds]]
迁移到iOS 6时,还有其他与屏幕尺寸无关的问题。有关详细信息,请阅读iOS 6.0 Release Notes。
答案 3 :(得分:22)
有时(对于故事前应用程序),如果布局变得非常不同,则值得根据设备指定不同的xib(请参阅this question - 您需要修改代码来处理iPhone 5)在viewController初始化中,因为如果您需要不同的图形,任何与自动调整蒙版的混合都不会有效。
-(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版本的应用非常有用。
答案 4 :(得分:20)
在这里你可以找到一个很好的教程(对于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英寸)”
创建其他图片,例如背景图片
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());
}
}
答案 5 :(得分:13)
通过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];
}
答案 6 :(得分:12)
我解决了这个问题here。只需将~568h @ 2x后缀添加到图像中,然后将〜568h添加到xib中。不需要更多的运行时检查或代码更改。
答案 7 :(得分:10)
我添加了新的默认启动图像(并查看了其他几个SE答案......)确保我的故事板全部自动调整尺寸和子视图,但视网膜4英寸仍然是信箱。
然后我注意到我的信息plist有一个“启动图片”的订单项设置为“ Default.png ”,我因此删除了,并且不再神奇地使用了letterboxing出现了。希望这可以为其他人节省我所忍受的同样的疯狂。
答案 8 :(得分:9)
我想,它并不适用于所有情况,但在我的特定项目中它避免了重复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...
}
答案 9 :(得分:9)
要确定您的应用是否支持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;
}
答案 10 :(得分:9)
在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)
答案 11 :(得分:8)
首先创建两个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
课程中,您也可以根据自己的要求在课程中的任何位置使用它。最重要的是,您为xib
iphone 4(320*480) and iphone 5(320*568)
个文件
答案 12 :(得分:7)
在单例类中尝试以下方法:
-(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";
}
答案 13 :(得分:7)
您可以使用Auto Layout
功能并使用iPhone 5屏幕分辨率创建设计,它适用于4“和3.5”设备,但在这种情况下,您应该对布局管理器有足够的了解。
答案 14 :(得分:7)
使用bounds
检查568
将在横向模式下失败。 iPhone 5仅在纵向模式下启动,但如果你想支持旋转,那么iPhone 5“check”也需要处理这种情况。
这是一个处理方向状态的宏:
#define IS_IPHONE_5 (CGSizeEqualToSize([[UIScreen mainScreen] preferredMode].size, CGSizeMake(640, 1136)))
'preferredMode'调用的使用来自我几小时前读过的另一篇帖子,所以我没有提出这个想法。
答案 15 :(得分:6)
我从来没有遇到任何设备的问题,因为我有一个代码库,没有任何硬编码值。我所做的是将最大尺寸的图像作为资源而不是每个设备使用一个。例如,我会有一个用于视网膜显示,并将其显示为适合方面,因此它将是每个设备上的视图。 例如,在运行时决定按钮的框架。为此,我使用专利视图的%值,例如,如果我希望宽度为父视图的一半占父级的50%,同样适用于高度和中心。
有了这个,我甚至不需要xibs。
答案 16 :(得分:6)
首先显示此图片。在该图像中,您显示Retina 4支持的警告,因此请单击此警告并单击添加,以便您的Retina 4启动屏幕自动添加到您的项目中。
并在您使用此代码后:
if([[UIScreen mainScreen] bounds].size.height == 568)
{
// For iphone 5
}
else
{
// For iphone 4 or less
}
答案 17 :(得分:5)
您可以使用此定义来计算您是否根据屏幕尺寸使用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
}
答案 18 :(得分:4)
彼得,你应该真的看看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。
答案 19 :(得分:4)
您可以手动检查屏幕尺寸以确定您使用的设备:
#define DEVICE_IS_IPHONE5 ([[UIScreen mainScreen] bounds].size.height == 568)
float height = DEVICE_IS_IPHONE5?568:480;
if (height == 568) {
// 4"
} else {
// 3"
}
答案 20 :(得分:3)
这是一个真正的通用代码,你可以创建3个不同的故事板:
设置您的项目通用模式,并使用iPhone5故事板和ipad主设置iPad目标故事板设置您的主要故事iPhone,现在为iphone添加新的故事板目标并修改iphone 4s或更少的分辨率现在实现您的 AppDelegate.m 强>
iPhone4 / 4s (对于3 / 3Gs来说是相同的)一个用于 iPhone5 并使项目通用,并使用新的Storyboard目标对于iPad,现在进入didFinishLaunching
下的 AppDelegate.m 添加此代码:
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创建了一个通用应用程序所有类型的iPod和所有类型的iPad
请务必将所有IMG与myImage.png
和myImage@2x.png
答案 21 :(得分: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");
}
}
答案 22 :(得分:2)
据我所知,处理此类问题并避免检查设备高度所需的几个条件的最佳方法是使用视图的相对框架或您要添加到的任何UI元素,例如:if你要在视图底部或标签栏上方添加一些你想要的UI元素,那么你应该根据视图的高度或标签栏(如果存在)获取y原点,并且我们将自动调整大小属性作为好。我希望这对你有用
答案 23 :(得分:1)
您可以使用屏幕大小自动调整视图大小,而不是使用一组条件。
int h = [[UIScreen mainScreen] bounds].size.height;
int w = [[UIScreen mainScreen] bounds].size.width;
self.imageView.frame = CGRectMake(20, 80, (h-200), (w-100));
在我的情况下,我想要一个视图填充顶部的一些输入字段和底部的一些按钮之间的空间,因此根据屏幕大小固定左上角和右下角。我的应用程序使用相机拍摄的照片填充图像视图,因此我想要所有可以获得的空间。
答案 24 :(得分:1)
如果您需要将现有应用转换为通用应用,则需要选择相应的xib文件 - > show Utilities-&gt;显示尺寸检查器。
在尺寸检查器中,您可以看到自动调整大小,使用此工具可以转换为现有的iOS应用程序。
答案 25 :(得分:0)
使用xCode 5,在Project&gt; General。
上选择“迁移到资产目录”然后使用“在Finder中显示”查找您的启动图像,您可以将其编辑为640x1136,然后将其拖动到资产目录中,如下图所示。
确保iOS7和iOS6 R4部分的图像都是640x1136。下次启动应用时,黑条将消失,您的应用将使用4英寸屏幕
答案 26 :(得分:0)
我建议根据您的UI界面在您的应用程序中使用Autoresizing Mask,它可以省去很多麻烦,并且比为iPhone 4和5屏幕制作不同的UI更好。
答案 27 :(得分:0)
值得注意 - 在新Xcode中,您必须将此图像文件Default-568h@2x.png添加到资产
答案 28 :(得分:0)
在iOS设备和iOS模拟器上进行测试时出现轻微问题。似乎模拟器(XCode 6.0.1)根据设备方向为[[UIScreen mainScreen] bounds].size
提供宽度和高度的切换值。
因此,在确定正确的物理屏幕尺寸时,这可能是一个问题。此代码也有助于区分所有2014年.iPhone模型代:
它也可以很容易地改变以区分例如来自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
}
答案 29 :(得分:0)
对视图使用Auto Layout
功能。它会自动调整到所有分辨率。
为具有控制器名称的控制器创建两个xib,后缀为~iphone或~ipad。在编译时,Xcode将根据设备采用正确的xib。
如果要为iPhone和iPad创建单个xib,如果视图足够简单,可以移植到iPhone和iPad,请使用大小类。