如何使xib兼容iphone 5和iphone 4设备

我想布局我的xib,使布局适合iPhone 5(4英寸视网膜)和3.5设备。

因为我必须支持IOS-5我不能使用自动布局。 我必须使用弹簧和Struts。

我尝试了界面构build器中的一切。 但是,无论是我的观点是超越了iPhone 3.5英寸的底部或不完全填充iPhone 4英寸视网膜。

有人可以提供一个提示如何实际上使xib兼容两个设备?

为了更清楚我添加屏幕截图:

当我在属性检查器中设置大小3.5: 当我在属性检查员的大小设置为3.5

它看起来在iphone-5。 button下方有一个空格: 这就是它在3.5英寸设备模拟器中的样子

如果我在界面生成器中设置大小4英寸。 你可以看到底部button在iPhone-4中不可见。 如果我在界面生成器中设置大小3.5英寸

所以你会问什么是我使用的设置。 他们是:

在这里输入图像描述在这里输入图像描述在这里输入图像描述

  1. 您为UIviewController添加新的类别并将其添加到.h文件中

    - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil; 
  2. 将这些代码添加到.m文件中

      - (id)initWithNibNameforIphone4:(NSString *)nibNameOrNil4 NibNameforIphone5:(NSString *)nibNameOrNil5 NibNameforIpad:(NSString *)nibNameOrNilpad bundle:(NSBundle *)nibBundleOrNil { if (self = [super init]) { self = [self initWithNibName:[self CheckDeviceIphone4:nibNameOrNil4 Iphone5:nibNameOrNil5 Ipad:nibNameOrNilpad] bundle:nibBundleOrNil]; } return self; } -(NSString *)CheckDeviceIphone4:(NSString *)iphone4 Iphone5:(NSString *)iphone5 Ipad:(NSString *)ipad { return ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) ? ipad :([[UIScreen mainScreen] bounds].size.height == 568) ? iphone5 :iphone4; } 
  3. 打开YouProject-Prefix.pch文件并在此处导入您的类别

  4. 现在你只需要在这个项目中使用它

      self.firstView=[[firstView alloc]initWithNibNameforIphone4:@"firstView4" NibNameforIphone5:@"firstView" NibNameforIpad:@"firstViewIpad" bundle:[NSBundle mainBundle]]; 

    感谢和任何问题然后评论,不要忘记upvote 🙂

\

尝试添加到所有你需要支持iPhone 5的控制器:

 - (void) loadView { [super loadView]; self.view.frame = [UIScreen mainScreen].bounds; } 

只需使用界面构build器将视图大小设置为无
它将在运行时占用视图大小,只需要在视图中关注每个元素(UILabel,UIImage等)的原点和自动调整。

  • 界面构build器(XIB) – >属性检查器 – >模拟指标 – 大小:无

在这里输入图像描述

今天我一直在努力,不pipe我做了什么,即使在视网膜4“模拟器上运行,我的视图总是显示为320×480,即使[UIScreen mainScreen] .bounds也是320×480!

我发现添加Default-568h@2x.png启动图像是让iOS将我的应用程序识别为“retina 4”准备就绪的关键。一旦我这样做,我发现必须做其他事情才能让笔尖自动resize没有黑条,不需要有两个独立的xib,改变Interface Builder中的设置,覆盖loadView等。

3.5英寸和4英寸的设备不需要使用不同的笔尖。 devise4英寸设备的应用程序,并正确设置AutoResizingMask,它应该正常工作。

在你的情况下,只需将AutoResizingMask设置为

 [view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth]; 

自动调整掩码将视图正确放置在两个设备中的位置。

如果你使用2个xib文件的解决scheme, 在initWithNibName()方法中,只需使用不同的nib名称调用super。

我会testing原始的480高度尺寸而不是568的高度,以便在苹果发布更大的屏幕时select更大的xib文件。 将来,至less较大的xib将不会像小一样那么多。

 // From MainView.m - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic self = [super initWithNibName:@"MainView" bundle:nibBundleOrNil]; } else { // iPhone 5 or maybe a larger iPhone ?? self = [super initWithNibName:@"MainView5" bundle:nibBundleOrNil]; } return self; } 

我有个主意。 让你的用户界面分为标题,正文和页脚(如网站)。 然后在你的代码控制台中findSize Inspector并使用Autosizing。

注意广场的外线,它是你对主视angular的控制位置。 将标题部分和正文部分中的控件(导航栏,UIImageView,UIButton等)设置为Top,将页脚(Bookmark,Close等)中的控件设置为Bottom。

每次运行时,控件都会附加到自动设置。 你将有一个iPhone 5的标题/正文和页脚之间的空间,但我认为没关系。

定义下面的行并根据设备检查条件。

 #define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
 如果(IS_IPHONE_5){
     btnBookmark.frame = CGRectMake(0,460,100,70);
     btnBookmark.frame = CGRectMake(150,460,100,70);
 }
 else {
     btnBookmark.frame = CGRectMake(0,360,100,70);
     btnBookmark.frame = CGRectMake(150,360,100,70);
 }

我也遇到了3.5“vs 4”的问题,而且我误解了什么是错误的,所以我想在这里logging下来,以帮助任何人。

如果您尝试访问self.view.frame它将不会正确报告,直到viewDidAppear或类似的事件。 如果您尝试从viewDidLoad访问self.view.frame ,则可以在自动resize之前报告框架的尺寸。

  • 在故事板中,点击“显示文件检查器”。
  • 在界面构build器文档 – >文档版本控制下,select部署= iOS 5(或您的select)。

如果这不起作用,你需要处理你的每个观点。 select他们。 在每个属性检查器下,在“查看”部分下,请参阅模式属性。 将其设置为“重绘”。

如果即使这样也不能给出令人满意的结果,请将视图大小设置为要使用的所有版本中的最小值。 并设置模式属性=“比例填充”。

以编程方式,Mode属性是view.contentmode属性。

如果不使用自动布局,您可能需要在代码中处理很多事情。 我认为你的大部分布局可以很好的使用spring和struts,但是一些UI元素不能这么简单地根据视图的大小手动设置特定对象的框架是必要的。

ivanzoid的片段上面,整个屏幕大小的查询只要你记得减去导航和工具栏的偏移量(在大多数情况下总共64)就可以了。

这是需要调整的视图高度; 弹簧和支柱否则照顾它。

在iPhone 5上重新testing我的应用程序我只需要在一个屏幕上执行一些运行时控制位置调整。 其他每个案例都由XIB默认值处理。

如果你不想使用两个xib,并有兴趣在这里使用Autosizing

如果你的用户界面太复杂,并包含太多的UIControls,那么我build议在viewDidLoad()中执行以下操作:

 NSLog(@"Iphone %f ",[[UIScreen mainScreen] bounds].size.height); if ([[UIScreen mainScreen] bounds].size.height == 568) { //design frames of your controls accordingly add add the controls as subview to self.view //this is iphone 5 xib } else { //design frames of your controls accordingly add add the controls as subview to self.view // this is iphone 4 xib }