【问题标题】:Change .xib size on different iPad screen resolution programmatically以编程方式更改不同 iPad 屏幕分辨率上的 .xib 大小
【发布时间】: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" width="1024" height="704"/>

然后我在 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" width="1366" height="960"/>

然后我在 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,它解决了我的问题。

【问题讨论】:

    标签: ios objective-c ipad


    【解决方案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 ..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多