【问题标题】:How to make xib compatible with both iphone 5 and iphone 4 devices如何使 xib 与 iphone 5 和 iphone 4 设备兼容
【发布时间】:2012-10-27 19:54:02
【问题描述】:

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

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

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

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

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

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

它看起来在 iphone-5 中。按钮下方有一个空格:

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

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

【问题讨论】:

  • @justin 感谢指正
  • 不客气(已删除初始评论)
  • 在头疼了这么多之后,我删除了我的 xib,重新创建它,删除了所有自动调整大小的蒙版。它开始在所有设备上工作。我想删除所有自动调整大小的蒙版是这里的诀窍..
  • 这对我有用 - 只需从按钮中删除自动调整大小的蒙版。
  • @JoshuaC.Lerner 从控件的工作中删除自动调整大小掩码后,此处相同。

标签: iphone xcode interface-builder


【解决方案1】:
  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]];
    

    谢谢,如有任何问题,请发表评论,不要忘记投票 :-)

\

【讨论】:

  • 如果您在应用程序中使用导航控制器,则添加此内容 [appDlgt.navController pushViewController: viewName animated:YES];
  • [[UIScreen mainScreen] bounds].size.height == 568 ,在有条件的情况下对我来说是非常糟糕的编程习惯
  • 如果项目包含大量 XIB 文件(比如 50 秒左右),这将成为一项糟糕的任务。
  • 请检查编辑并希望您的问题得到解决 :-) 不要忘记投票
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    • Interface-builder(XIB) -> 属性检查器 -> 模拟指标 - 大小:无

    【讨论】:

    • @bijan...你遇到什么问题?
    • 在将 Size 属性设置为“None”后,我仍然可以在 iPhone 5 Simulator 上看到 iPhone 4 的高度视图。
    • 这只会改变外包装,这对大多数将 stuff 放在视图中的人没有帮助(他们不会让视图为空,它有文本字段,按钮等,这个答案不包括)。
    • 要调整 UIButton/UILabel 的大小或重新定位您需要选择该特定项目,然后从“解决自动布局问题”(位于右下角,四个按钮中的左起第三个)按“在视图中添加缺少的约束”。
    【解决方案4】:

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

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

    【讨论】:

    • 难以置信,对我来说完全一样。我在 xcode 中收到关于缺少 Default-568h@2x.png 文件的警告,xcode 甚至提出为我添加它。之后一切都是金色的。
    【解决方案5】:

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

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

    [view setAutoresizingMask:UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth];
    

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

    【讨论】:

      【解决方案6】:

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

      我会测试原始的 480 高度尺寸而不是 568 高度,以便在 Apple 发布更大的屏幕时选择更大的 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;
      }
      

      【讨论】:

        【解决方案7】:

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

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

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

        【讨论】:

        • @katzenhut 好吧,随便。谢谢你。反正我不再给意见了。
        • 这里有一个您可能喜欢的想法:如果您想要投票,请阅读您正在回答的问题。
        • @katzenhut 你可以自己阅读这个问题,OP 说他不能使用 Autolayout,而不是 Autosizing。
        【解决方案8】:

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

        #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);
        }
        别的 {
            btnBookmark.frame=CGRectMake(0, 360, 100, 70);
            btnBookmark.frame=CGRectMake(150, 360, 100, 70);
        }
        

        【讨论】:

          【解决方案9】:

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

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

          【讨论】:

            【解决方案10】:
            • 在情节提要中,点击“显示文件检查器”。
            • 在 Interface builder document->Document versioning 下,选择 Deployment=iOS 5(或您的选择)。

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

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

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

            【讨论】:

              【解决方案11】:

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

              【讨论】:

              • 我加了截图你知道这种情况怎么处理吗?
              【解决方案12】:

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

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

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

              【讨论】:

                【解决方案13】:

                如果您不想使用两个 xib 并有兴趣使用 Autosizing here

                【讨论】:

                  【解决方案14】:

                  如果你的 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
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-04-06
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2023-03-17
                    相关资源
                    最近更新 更多