0

我在适应新的 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);
4

3 回答 3

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根据可用空间调整视图大小,因此如果您有例如 aUITabBarController包含 aUINavigationController本身UIViewController在其堆栈顶部显示 a ,则最后一个的高度viewControllerview将是屏幕的高度减去 tabBar、statusBar 和 navBar 的高度。

因此,不要获取[UIScreen mainScreen].applicationFrame例如,并减去 tabBar(如果有)和 navBar 高度以获得 367pt 的值,只需直接使用viewController's的高度,view您应该直接获得正确的值。


附加说明:你应该给你的第二个参数一个前缀,因此命名你的方法setTableBoundsByHeight:tableView:而不是setTableBoundsByHeight::第二个参数没有任何前缀。(参见@MrMage 的回答,也暗示了这一点)。

例如,更好地命名您的方法甚至可以更好地setHeight:forTableView:适应 Apple 命名约定。

于 2012-09-23T16:17:47.550 回答
0

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

顺便说一句:你真的应该重命名

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

类似于

+ (CGRect)setTableBoundsByHeight:(int)lHeight tableView:(UITableView *)tbl
于 2012-09-23T16:00:06.767 回答
0

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

于 2012-09-23T15:47:58.937 回答