iOS如何从底部滑入视图,占导航栏+状态栏高度

时间:2014-04-28 23:44:39

标签: ios uinavigationbar subview uistatusbar

我试图在root view controller内的UINavigationController内显示自定义视图,例如操作表,但我总是因为我没有帐户而模糊了底部对于UINavigationBar + status bar身高。

例如,以下代码将隐藏customView底部的64个点:

CGFloat height = [UIScreen mainScreen].bounds.size.height;

[UIView animateWithDuration:0.5 animations:^{
    customView.center = CGPointMake(width / 2.0, height - customViewHeight / 2.0);
}];

我可以使用setFrame代替center,但这无关紧要,因为它会或多或少地给我相同的结果。

我知道使用像-64 pts这样的常量是不可取的,所以有没有将点转换为实际的屏幕坐标?什么是最佳做法?

编辑(可能是其他问题)

我试图从屏幕底部外侧看到一个视图,就像UIActionSheet一样,每当我尝试这样做时,我总会遇到同样的问题。

我尝试将初始子视图frame origin.y设置为屏幕高度,并将子视图设置为(screenHeight - subviewHeight)的动画,这就是为什么我总是遇到我的问题底部64个CGPoints模糊不清。

执行此类实施的最佳方法是什么?我尝试过搜索示例代码,但我只看到使用CGPoint height = 480.0 - subviewHeight;等高度的代码,我听说这是不好的做法。

3 个答案:

答案 0 :(得分:1)

一种方法

@implementation UIView (XXScreenConversions)
- (CGPoint)xx_pointFromScreenPoint:(CGPoint)point {
    CGPoint inWindow = [self.window convertPoint:point fromWindow:nil];
    return [self.window convertPoint:inWindow toView:self];
}

- (CGPoint)xx_screenPointFromPoint:(CGPoint)point {
    CGPoint inWindow = [self.window convertPoint:point fromView:self];
    return [self.window convertPoint:inWindow toWindow:nil];
}
@end

答案 1 :(得分:1)

除了Adam的回复之外,我认为你不应该依赖计算中的屏幕高度。因为你可能正在添加你的子视图的超级视图实际上并不是全屏,所以它正在推动底部关闭。

如果您正在投掷各地,最好抓住您正在添加的视图的view.bounds并将其用于帧计算。

如果您正在使用自动布局(如果没有,请了解它,因为它非常棒),请使用topLayoutGuide

答案 2 :(得分:0)

你是令人困惑的点和像素。 Point是热金属排版时代排版的衡量标准(它可能意味着许多物理测量)。 CGPointMake意义上的一个点就是屏幕上以像素为单位的位置。您需要做的是更准确地衡量height值。

您应该在Apple" iOS 7用户界面转换指南"中查看this page。了解如何在正确计算屏幕高度时使用topLayoutGuide等帮助器视图。很可能你会发现topLayoutGuide能够完美地处理64个像素,这总是符合我的经验。