Search code examples
iosiphonesize-classesadaptive-layout

Use Adaptive Layout programmatically to resize static cells height for hCompact


In a portait-only word game I use static cells to display an IAP store:

iPhone screenshot

You can see my problem in the iPhone 4 screenshot above - the pink button (to watch video ads and receive 150 coins) at the bottom is not visible.

Here is my Xcode screenshot (please click for fullscreen):

Xcode screenshot

I use 7 static cells:

  • Blueish top cell with Back button, title, money bag icon
  • Status text (not visible in the above screenshot)
  • Coins pack 1
  • Coins pack 2
  • Coins pack 3
  • Coins pack 4
  • Video ads (pink cell at the bottom - has the problem of being not visible on iPhone 4 and other compact devices)

And resize the cells with this method:

- (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?
}

My question is: how to resize the cells height programmatically for devices with compact height (the hCompact size class in Adaptive Layout).

UPDATE:

My own ugly solution has been sofar:

@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;
}

Solution

  • I would write a helper that looks at the vertical size Class for the current trait collection

    - (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];
    }