45

我正在尝试布局我的 xib,以便布局适合 iphone 5(4 英寸视网膜)和 3.5 设备。

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

我尝试了界面生成器中的所有内容。但要么我的观点超出了 iphone-3.5 英寸的底部,要么没有完全填充 iphone-4 英寸视网膜。

有人可以提示如何使 xib 与这两种设备兼容吗?

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

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

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

如果我在界面生成器中设置尺寸 4 英寸。您可以看到底部按钮在 iphone-4 中不可见。 如果我在界面生成器中设置尺寸 3.5 英寸

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

在此处输入图像描述 在此处输入图像描述 在此处输入图像描述

4

14 回答 14

38
  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]];
    

    谢谢和任何问题然后发表评论,不要忘记投票:-)

\

于 2012-11-08T06:43:04.900 回答
20

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

- (void) loadView
{
    [super loadView];
    self.view.frame = [UIScreen mainScreen].bounds;
}
于 2012-12-21T07:58:31.857 回答
11

只需使用 Interface-builder
将视图大小设置为 None 它会在运行时获取视图大小,只需要处理视图中每个元素(UILabel、UIImage 等)的原点和自动调整大小。

  • Interface-builder(XIB) -> Attribute Inspector -> Simulated Metrics - 大小:无

在此处输入图像描述

于 2013-04-17T10:47:32.583 回答
6

我今天为此苦苦挣扎,无论我做什么,我的视图总是显示为 320x480,即使在视网膜 4" 模拟器上运行时也是如此。甚至 [UIScreen mainScreen].bounds 也返回 320x480!

我发现添加 Default-568h@2x.png 启动图像是让 iOS 将我的应用程序识别为“准备好视网膜 4”的关键。一旦我这样做了,我发现不需要做任何其他事情来让笔尖自动调整大小没有黑条。不需要有两个单独的 xib,在 Interface Builder 中更改设置,覆盖 loadView 等。

于 2014-02-14T22:55:54.443 回答
3

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

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

[view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];

自动调整大小的蒙版将视图正确地放置在两个设备中的位置。

于 2013-09-05T11:53:02.177 回答
3

如果您选择使用 2 个 xib 文件的解决方案;在您的 initWithNibName() 方法中,只需使用不同的 nib 名称调用 super 即可。

我将测试原始的 480 高度尺寸而不是 568 高度,以便在 Apple 发布更大的屏幕时选择更大的 xib 文件。在未来,至少较大的 xib 不会像较小的 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;
}
于 2013-10-02T12:37:14.537 回答
1

我有个主意。让您的 UI 分为页眉、正文和页脚(如网站)。然后在您的代码控制台中,找到 Size Inspector 并使用 Autosizing。

注意正方形的外线,它是您对主视图的控制位置。将页眉部分和正文部分中的控件(导航栏、UIImageView、UIButton 等)设置为顶部,将页脚中的控件(书签、关闭等)设置为底部。

每次运行时,控件都会附加到它们的自动调整大小设置。在 iPhone 5 上,页眉/正文和页脚之间会有一个空格,但我认为这很好。

于 2012-11-08T03:05:10.447 回答
1

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

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - ( double )568 ) 
if (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);
}
于 2013-11-20T09:36:02.680 回答
1

我也遇到了 3.5" 和 4" 的问题,我误解了哪里出了问题,所以我想在这里记录一下,以防它帮助任何人。

如果您尝试访问它,直到或某些类似事件self.view.frame才会正确报告。viewDidAppear如果您尝试self.view.frame从内部访问,viewDidLoad则可以在自动调整大小之前报告框架的尺寸。

于 2014-02-07T02:06:37.340 回答
0

如果不使用自动布局,您可能需要在代码中处理很多事情。我假设您的大多数布局都可以很好地使用弹簧和支柱,但某些 UI 元素不能,因此只需根据您的视图大小手动设置某些对象的框架是必要的。

于 2012-11-07T17:56:34.927 回答
0
  • 在情节提要中,单击“显示文件检查器”。
  • 在 Interface builder document->Document versioning 下,选择 Deployment=iOS 5(或您的选择)。

如果这不起作用,您需要处理每个视图。选择它们。在它们每个的属性检查器下,在视图部分下,请参阅模式属性。将此设置为“重绘”。

如果即使这样也不能得到令人满意的结果,请将视图大小设置为您将要使用的所有版本中的最小值。并设置 Mode 属性 = 'Scale to fill'。

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

于 2012-11-07T18:00:28.960 回答
0

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

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

在 iPhone 5 上重新测试我的应用程序,我只需要在一个屏幕上执行此操作,并调整一些运行时控制位置。其他所有情况均由 XIB 默认处理。

于 2013-05-01T15:13:56.093 回答
0

如果您不想使用两个 xib 并且有兴趣在 此处使用 Autosizing

于 2013-06-21T06:12:09.043 回答
-1

如果你的 UI 太复杂并且包含太多 UIControls ,那么我建议在 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
}
于 2013-06-21T06:19:55.100 回答