Obj-C,如何在所有iPhone尺寸上获得子视图的高度?

时间:2012-09-23 15:18:35

标签: iphone objective-c ios xcode

我在迎接新的iPhone 5屏幕高度方面遇到了一些麻烦,我需要调整我的桌面视图以显示广告。

直到iOS6我没有问题,我使用了以下功能,但它没有使用比例。说实话,我很惊讶它有效。

+ (CGRect)setTableBoundsByHeight:(int)lHeight:(UITableView*)tbl {
    CGRect tableFrame = tbl.frame;
    return CGRectMake(tableFrame.origin.x,
                      tableFrame.origin.y,
                      tableFrame.size.width,
                      lHeight);
}

这是代码,我在367处硬编码了表格视图的高度,这是减去导航控制器和标签栏的高度。 50是广告的高度。

if (!productPurchased) {
#ifdef VER_FREE  
    [[LARSAdController sharedManager] 
           addAdContainerToView:self.view withParentViewController:self];
    [[LARSAdController sharedManager] 
           setGoogleAdPublisherId:@"number"];
    [reportTableView setFrame:[General 
           setTableBoundsByHeight:(367-50):reportTableView]];
#endif
} else {
    [reportTableView setFrame:[General 
           setTableBoundsByHeight:367:reportTableView]];
}

我发现了一些可扩展的代码,但我不确定如何实现它。

CGFloat scale = [UIScreen mainScreen].scale;
result = CGSizeMake(result.width * scale, result.height * scale);

3 个答案:

答案 0 :(得分:0)

忽略比例,它会自动缩放。只需检查iPhone 5是否设置不同的高度,但你使用iphone5像素数/ 2,因为它会将其缩放到2倍本身。

答案 1 :(得分:0)

如果此代码在视图控制器中,请使用self.view.bounds.height而不是367。

顺便说一下:你应该重命名

+ (CGRect)setTableBoundsByHeight:(int)lHeight:(UITableView*)tbl

类似

+ (CGRect)setTableBoundsByHeight:(int)lHeight tableView:(UITableView *)tbl

答案 2 :(得分:0)

使用硬编码值(例如“神奇数字”)是一种错误的习惯,你现在明白为什么。总是更喜欢使用常量或运行时计算的值。此外,它使代码更容易阅读,因为通过使用常量,您将知道数字对应的内容,而不是来自任何地方的“魔术数字”。

因此,对于您的问题,请使用下面的代码在运行时计算高度值。

// simply use the height of the current viewController's `view`
// which is probably the view of the `navigationController`'s `topViewController`
// and is already at the correct size, namely 367 in iPhone 3.5" and 455 in iPhone 4".
CGFloat screenHeight = self.view.height;
if (!productPurchased)
{
  static CGFloat advertHeight = 50;
#ifdef VER_FREE  
  [[LARSAdController sharedManager] 
       addAdContainerToView:self.view withParentViewController:self];
  [[LARSAdController sharedManager] 
       setGoogleAdPublisherId:@"number"];
  [reportTableView setFrame:[General 
       setTableBoundsByHeight:(screenHeight-advertHeight):reportTableView]];
#endif
} else {
  [reportTableView setFrame:[General 
       setTableBoundsByHeight:screenHeight:reportTableView]];
}

请注意,您不需要自己进行任何减法,因为UIViewControllers会根据可用空间调整其视图大小,因此如果您有UITabBarController包含UINavigationController 1}}它本身在其堆栈顶部显示UIViewController,最后一个viewController的view的高度将是屏幕的高度减去tabBar,statusBar和navBar高度。

因此,不是提取[UIScreen mainScreen].applicationFrame,而是减去tabBar(如果有的话)和navBar高度以获得367pt的值,只需使用viewController的{​​{1}的高度直接,你应该直接拥有正确的值。


附加说明:您应该为第二个参数添加前缀,因此将方法命名为view而不是setTableBoundsByHeight:tableView:,其中第二个参数没有任何前缀。 (参见@MrMage的回答也提示这一点。)

更好的命名方法甚至可以是setTableBoundsByHeight::,例如,更符合Apple命名约定。