以编程方式更改不同 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 在 viewDidLoad 很可能还没有完成它的工作。尝试在 viewWillAppear 或 viewDidAppear 上调用这些东西 - 你会看到它们保持不变。
有一点要看。 viewDidLoad 只调用一次,显然是在第一次加载时。 viewWillAppear 显然在视图实际出现时被调用,但这也包括诸如 - 假设您将视图控制器推到顶部,然后弹出它。因此可以在同一个对象上多次调用它。请注意,您不要多次制作此对象。使其成为实例属性,并在创建之前先检查它是否存在,例如if (self.hudObject == nil) make object ..
以上是关于以编程方式更改不同 iPad 屏幕分辨率上的 .xib 大小的主要内容,如果未能解决你的问题,请参考以下文章