以编程方式使用Adaptive Layout为hCompact调整静态单元格高度

时间:2015-04-19 10:48:55

标签: ios iphone size-classes adaptive-layout

在仅限于肖像的文字游戏中,我使用静态单元格来显示IAP商店:

iPhone screenshot

您可以在上面的iPhone 4截图中看到我的问题 - 底部的粉红色按钮(观看视频广告并收到150个硬币)不可见。

这是我的Xcode截图(请点击fullscreen):

Xcode screenshot

我使用7个静态细胞:

  • 蓝色顶部单元格,带有后退按钮,标题,钱包图标
  • 状态文字(在上面的屏幕截图中不可见)
  • Coins pack 1
  • Coins pack 2
  • Coins pack 3
  • Coins pack 4
  • 视频广告(底部的粉红色单元格 - 存在iPhone 4和其他小型设备上无法看到的问题)

用这种方法调整细胞大小:

- (CGFloat)tableView:(UITableView *)tableView
   heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath row] == 0)
        return 70;

    if ([indexPath row] == 1)
        return 35;

    return 90; // XXX how to change this to 70 for hCompact?
}

我的问题是:如何为具有紧凑高度的设备(Adaptive Layout中的 hCompact 尺寸类)以编程方式调整单元格高度。

更新

我自己丑陋的解决方案已经过去了:

@interface StoreCoinsViewController ()
{
    int _cellHeight;
}

- (int)setCellHeight  // called in viewDidLoad
{
    int screenHeight = UIScreen.mainScreen.bounds.size.height;
    NSLog(@"screenHeight=%d", screenHeight);

    if (screenHeight >= 1024)  // iPad
        return 160;

    if (screenHeight >= 736)   // iPhone 6 Plus
        return 110;

    if (screenHeight >= 667)   // iPhone 6
        return 100;

    if (screenHeight >= 568)   // iPhone 5
        return 90;

    return 72;  // iPhone 4s (height=480) and earlier
}
- (CGFloat)tableView:(UITableView *)tableView
      heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([indexPath row] == 0)
        return 70;

    if ([indexPath row] == 1)
        return 35;

    return _cellHeight;
}

3 个答案:

答案 0 :(得分:1)

我会编写一个帮助器来查看当前特征集合的垂直大小类

- (CGFloat)verticalSizeForCurrentTraitCollection {
    switch (self.traitCollection.verticalSizeClass) {
        case UIUserInterfaceSizeClassCompact:
            return 70;
        case UIUserInterfaceSizeClassRegular:
            return 90;
        case UIUserInterfaceSizeClassUnspecified:
            return 80;
    }
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    if ([indexPath row] == 0)
        return 70;

    if ([indexPath row] == 1)
        return 35;

    return [self verticalSizeForCurrentTraitCollection];
}

答案 1 :(得分:1)

每个UIViewController都有一个traitCollection属性,您可以在代码中使用它。

在您的情况下,您可以这样检查:

if self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact {
    return 70;
}
else {
    return 90
}

答案 2 :(得分:0)

作为这种情况下的解决方案,无论如何只需要很少的单元格,带有子视图容器的scrollview就能完美地满足您的需求。我知道的代码多一点,但并不比手动计算每个单元格的高度差。等待更好的解决方案。