我正在使用Xcode 6和iOS 8在Objective-C中编写应用程序。该应用程序需要能够部署在iPhone 5,6或6 +上。
如果您想直接回答我的问题,请跳到最后一句话。如果你想了解我为什么会有这样的问题,或者我可以改变我的UI布局以便以另一种方式解决我的问题,请继续阅读。
在我的一个视图控制器中,我有一个滚动视图,其顶部约束在导航栏的底部,其底部约束在表视图的顶部。表格视图的底部被限制在视图控制器主视图的底部(即手机底部)。
滚动视图包含用户点击它们时展开/收缩的子视图。我希望滚动视图随着子视图的增长而增长,但显然我不希望滚动视图在屏幕上生长,因为它看起来很糟糕,因为它会导致不可满足的约束(表格视图的顶部 - 它被限制在滚动视图的底部 - 将在其底部下方交叉 - 这被约束到主视图的底部......这会导致错误)。因此,我使用以下代码使滚动视图根据其子视图大小自行调整大小,而不会在屏幕上显示:
// The max height before the scroll view would go off screen, which would
// mess up the table view's constraints and cause all sorts of problems
CGFloat maxHeight = self.view.size.height
- self.navigationController.navigationBar.frame.size.height
- [UIApplication sharedApplication].statusBarFrame.size.height;
// The height of all the subviews in the scroll view.
CGFloat height = _scrollContentView.frame.size.height;
if (height > maxHeight) {
height = maxHeight;
}
self.scrollViewHeightConstraint.constant = height;
现在为有趣的部分。最初,每当我将设备从纵向旋转到横向时,我都会调用此代码来重新评估和重置滚动视图的大小,反之亦然。但是,当我将手机从纵向旋转到横向时,我遇到了约束错误。我确定这是因为我在旋转后调用此代码,当主视图的高度较小时,但滚动视图的高度仍然很大(导致表格)如我前面所解释的那样,查看最低点到底部等等。所以,我只是将代码移动到之前旋转(我在viewWillTransitionWithSize:withTransitionCoordinator:
方法中调用了代码)。到目前为止,这一切都是有道理的。
但是,现在问题是导航条的高度在旋转发生时会发生变化,但viewWillTransitionWithSize:...
方法不包含此更改的任何详细信息(它只给出新的大小,主视图将在旋转完成时,而不是导航栏的新尺寸。)
所以,我需要在设备的方向实际发生变化之前确定导航栏的新尺寸(就像我之前可以确定主视图的新尺寸一样)设备的方向实际上使用viewWillTransitionWithSize:...
方法更改。
有什么想法吗? TIA!
答案 0 :(得分:0)
所以,这是我最简单的形式:
/*
* This method gets called when the device is about to rotate.
*/
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
// Set the scroll view's height to 0 to avoid constraints errors as described
// in the question.
self.scrollViewHeightConstraint.constant = 0;
}
/*
* At the point when this method gets called, the device rotation has finished altering
* the frames of the views in this view controller, but the layout has not finished
* so nothing has changed on screen.
*/
- (void)viewWillLayoutSubviews
{
// The max height before the scroll view would go off screen, which would mess up
// the table view's constraints and cause all sorts of problems
CGFloat maxHeight = self.view.size.height
- self.navigationController.navigationBar.frame.size.height
- [UIApplication sharedApplication].statusBarFrame.size.height;
// The height of all the subviews in the scroll view.
CGFloat height = _scrollContentView.frame.size.height;
if (height > maxHeight) {
height = maxHeight;
}
// Reset the scroll view's height to the appropriate height.
self.scrollViewHeightConstraint.constant = height;
[super viewWillLayoutSubviews];
}