检测设备类型&方向来调整视图

时间:2013-10-09 16:27:59

标签: ios objective-c if-statement orientation device

我很确定我现在正以完全错误的方式解决这个问题 - 但在我放弃发货之前重新开始我以为我会问...我基本上需要能够检测到使用该应用程序的设备(iPhone 4或iPhone 5)&设备所处的方向&然后根据这些调整我的viewcontroller的输出 - 这就是我所拥有的:

要检测设备(确定它没有检测到设备,只是它是一个更大的屏幕,但对我来说没问题!):

#define IS_IPHONE_5 ( fabs( ( double )[ [ UIScreen mainScreen ] bounds ].size.height - (    double )568 ) < DBL_EPSILON )

使用宏来检测设备,以及检测方向和代码的代码。然后调整视图:

- (void)doLayoutForOrientation:(UIInterfaceOrientation)orientation {
if (UIInterfaceOrientationIsPortrait(orientation)) {
    _Logo.frame = CGRectMake(97, 50, 127, 150);
    _timeLabel.frame = CGRectMake(17, 248, 286, 21);
    _years.frame = CGRectMake(70, 277, 35, 50);
    _yearsLabel.frame = CGRectMake(64, 335, 42, 21);
    _months.frame = CGRectMake(145, 277, 35, 50);
    _monthsLabel.frame = CGRectMake(131, 335, 58, 21);
    _days.frame = CGRectMake(220, 277, 35, 50);
    _daysLabel.frame = CGRectMake(216, 335, 39, 21);
    _hours.frame = CGRectMake(70, 393, 35, 50);
    _hoursLabel.frame = CGRectMake(62, 451, 46, 21);
    _minutes.frame = CGRectMake(145, 393, 35, 50);
    _minutesLabel.frame = CGRectMake(132, 451, 61, 21);
    _seconds.frame = CGRectMake(220, 393, 35, 50);
    _secondsLabel.frame = CGRectMake(203, 451, 68, 21);
} if (UIInterfaceOrientationIsLandscape(orientation) && IS_IPHONE_5) {
    _Logo.frame = CGRectMake(221, 20, 127, 150);
    _timeLabel.frame = CGRectMake(141, 178, 286, 21);
    _years.frame = CGRectMake(87, 221, 35, 50);
    _yearsLabel.frame = CGRectMake(83, 279, 42, 21);
    _months.frame = CGRectMake(162, 221, 35, 50);
    _monthsLabel.frame = CGRectMake(150, 279, 58, 21);
    _days.frame = CGRectMake(234, 221, 35, 50);
    _daysLabel.frame = CGRectMake(232, 279, 39, 21);
    _hours.frame = CGRectMake(308, 221, 35, 50);
    _hoursLabel.frame = CGRectMake(302, 279, 46, 21);
    _minutes.frame = CGRectMake(385, 221, 35, 50);
    _minutesLabel.frame = CGRectMake(372, 279, 61, 21);
    _seconds.frame = CGRectMake(466, 221, 35, 50);
    _secondsLabel.frame = CGRectMake(449, 279, 68, 21);
} else {
    _Logo.frame = CGRectMake(177, 20, 127, 150);
    _timeLabel.frame = CGRectMake(97, 178, 286, 21);
    _years.frame = CGRectMake(27, 221, 35, 50);
    _yearsLabel.frame = CGRectMake(23, 279, 42, 21);
    _months.frame = CGRectMake(102, 221, 35, 50);
    _monthsLabel.frame = CGRectMake(90, 279, 58, 21);
    _days.frame = CGRectMake(174, 221, 35, 50);
    _daysLabel.frame = CGRectMake(172, 279, 39, 21);
    _hours.frame = CGRectMake(248, 221, 35, 50);
    _hoursLabel.frame = CGRectMake(242, 279, 46, 21);
    _minutes.frame = CGRectMake(325, 221, 35, 50);
    _minutesLabel.frame = CGRectMake(312, 279, 61, 21);
    _seconds.frame = CGRectMake(406, 221, 35, 50);
    _secondsLabel.frame = CGRectMake(389, 279, 68, 21);
}
}

如果我注释掉中间位,应用程序在iPhone 5模拟器上正常运行,但是当我使用iPhone 4模拟器和放大器时旋转设备标签离开屏幕 - 这是我需要检测设备的原因(两个设备上的纵向模式都很好,因为底部标签组不会到达屏幕底部)。

如果我按原样运行 - 标签&amp;即使设备(任何设备)处于纵向模式/视图,徽标也会以横向视图显示。

我猜这个问题是我的设置/计划的某种形式的“跌落”或逻辑错误,但我想不出另一种方法来对此进行单词/编程。

由于

1 个答案:

答案 0 :(得分:0)

我认为你希望else块中的代码只能在横向模式下运行3.5英寸设备吗? 在这种情况下,你需要在第二个之前添加一个else,否则else语句之后的第三个代码块将始终运行,如果我理解正确,它将创建一个横向布局,无论你传递的方向如何。< / p>