以编程方式更改不同 iPad 屏幕分辨率上的 .xib 大小

Posted

技术标签:

【中文标题】以编程方式更改不同 iPad 屏幕分辨率上的 .xib 大小【英文标题】:Change .xib size on different iPad screen resolution programmatically 【发布时间】:2016-05-19 07:01:10 【问题描述】:

我在 iPad mini/iPad 4 和 iPad Pro 的视图中显示 HUD 时遇到问题。它不会像它应该的那样去中心。而且我认为,这是我的 .xib 大小的问题。这取决于模拟的指标设置。

我尝试使用模拟指标设置 .xib,

1. iPad 全屏

我将 .xib 设置为 iPad 全屏,

如果我作为源代码打开,它会给我 1024 x 704 的分辨率。

<rect key="frame" x="0.0" y="64"  />

然后我在 iPad 上运行它,我的 HUD 就应该居中。但如果我在 iPad Pro 上运行,我的 HUD 也不会居中。看起来我的 HUD 仍在 1024 x 704 的中心。

2。 iPad Pro 全屏

我尝试使用 iPad Pro 全屏设置 .xib

它给了我 1366 x 960 的分辨率

<rect key="frame" x="0.0" y="64"  />

然后我在 iPad Pro 上运行它,我的 HUD 应该是居中的。但如果我在 iPad 上运行,我的 HUD 也不会居中。看起来我的 HUD 仍在 1366 x 960 的中心。

我不认为模拟指标的设置会影响我的 HUD 问题,正如它所说的 here。我正在使用JGProgressHUD btw,这是我展示 HUD 的方式。

HUD = [JGProgressHUD progressHUDWithStyle:JGProgressHUDStyleDark];
HUD.textLabel.text = NSLocalizedString(@"MISC_LOADING_DATA", nil);
[HUD showInView:self.view];

此 HUD 将自动以 self.view 为中心,我认为重要的是我的 .xib 大小。我的问题是,我应该如何设置 .xib 大小以使我的 HUD 在 iPad 和 iPad Pro 上居中?

任何帮助将不胜感激。谢谢。

更新

我的问题是viewDidLoad 上的self.view.bounds.size 值与某些方法的完成处理程序上的self.view.bounds.size 不同。

- (void)viewDidLoad 
    [super viewDidLoad];

    // first print
    NSLog(@"Height: %f", self.view.bounds.size.height);
    NSLog(@"Width: %f", self.view.bounds.size.width);

    [self generateData:^(BOOL result) 
        if (HUD.superview) 
            [HUD dismiss];

            // 2nd print on completion handler
            NSLog(@"Height: %f", self.view.bounds.size.height);
            NSLog(@"Width: %f", self.view.bounds.size.width);
        
    ];

我在 iPad Pro 上运行。在第一次打印时,它给了我

2016-05-19 16:39:31.529 hr-akses[34013:1535416] Height: 704.000000
2016-05-19 16:39:31.529 hr-akses[34013:1535416] Width: 1024.000000

但在第二次打印时,它给了我

2016-05-19 16:39:31.607 hr-akses[34013:1535416] Height: 960.000000
2016-05-19 16:39:31.607 hr-akses[34013:1535416] Width: 1366.000000

。 .

已解决

正如Luke Smith 所说,viewDidLoad 的自动布局很可能还没有完成。我在viewWillAppear 上初始化了我的HUD,它解决了我的问题。

【问题讨论】:

【参考方案1】:

您在此处使用的此尺寸设置纯粹是针对 Interface Builder 中编辑屏幕的尺寸。您的问题不在于此设置,而在于您没有提到的自动布局规则。

试试这些规则,例如:从顶部固定 4 个像素,并给它一个固定的宽度和高度,你需要这个:

然后要修复它使其始终水平居中,您需要这个:

(请注意方框中的勾号,以及位置约束上的红色标记 - 那些是在那里创建的)

现在有了这 4 条规则,您的项目始终水平居中,距离顶部 4,并且在从手表到 iPad Pro 的任何设备上都设置了宽度和高度。

如果您现在更改 Simulated Metrics 中的 Size 设置,是的,IB 屏幕可能会出现一些错误,但相同的规则仍然存在,并且在运行时仍然有效。错误只是在 Interface Builder 中显示的布局 - 即,规则说该项目应该是死中心,但现在它不是。

如果 IB 屏幕仍然显示错误,您可以做的是选择有定位错误的屏幕项,然后执行以下两项操作之一:

更新框架:如果您选择此项,它会采用规则,并像应用程序正在运行一样应用它们。因此,如果规则说它应该居中,并且它当前在 Interface Builder 中没有居中,那么选择它会进行居中。

更新约束:如果您选择此项,IB 假定项目的位置是实际正确的(例如,如果它不是居中的),而不是更改项目的位置,而是更改规则本身以适应位置该项目当前在。

和那些玩玩,让它沉入其中——这些东西真的很方便,而且一直都在使用。

【讨论】:

我的所有对象也会显示出来。我按照你的建议做了,谢谢。但我的问题是我的self.view.bounds.size 值是基于模拟指标设置的。我仍然不知道为什么。 self.view.bounds.size 的值绝对取决于设备和运行时的视图大小。我100%肯定这一点。 :) 根据您的建议决定深入了解后,我发现了一个奇怪的案例。请看我的更新。但首先,非常感谢@Luke Smith。 autolayout 在 vi​​ewDidLoad 很可能还没有完成它的工作。尝试在 viewWillAppear 或 viewDidAppear 上调用这些东西 - 你会看到它们保持不变。 有一点要看。 viewDidLoad 只调用一次,显然是在第一次加载时。 viewWillAppear 显然在视图实际出现时被调用,但这也包括诸如 - 假设您将视图控制器推到顶部,然后弹出它。因此可以在同一个对象上多次调用它。请注意,您不要多次制作此对象。使其成为实例属性,并在创建之前先检查它是否存在,例如if (self.hudObject == nil) make object ..

以上是关于以编程方式更改不同 iPad 屏幕分辨率上的 .xib 大小的主要内容,如果未能解决你的问题,请参考以下文章

什么是 iPad 用户代理?

支持iPhone 6和iPhone 6+,具有不同的启动/启动屏幕图像,适用于iPad纵向和横向方向

以编程方式更改视图方向而无需旋转 ipad

以编程方式在 iPad 中截屏

调整网站宽度以适应 iPad 屏幕的宽度

如何以编程方式在 ipad 上打开 html 选择选项