以编程方式使用自适应布局调整 hCompact 的静态单元格高度
Use Adaptive Layout programmatically to resize static cells height for hCompact
在 portait-only 文字游戏中,我使用静态单元格来显示 IAP 商店:
你可以在上面的 iPhone4 屏幕截图中看到我的问题 - 底部的粉红色按钮(观看视频广告并获得 150 个金币)不可见。
这是我的Xcode截图(请点击fullscreen):
我使用了 7 个静态单元:
- 带有 返回 按钮、标题、钱袋图标的蓝色顶部单元格
- 状态文本(在上面的屏幕截图中不可见)
- 金币包 1
- 金币包 2
- 金币包 3
- 金币包 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 大小 class)。
更新:
到目前为止,我自己的丑陋解决方案是:
@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;
}
作为这种情况下的解决方法,无论如何,单元格数量如此之少,带有子视图容器的滚动视图将完全满足您的需求。我知道更多的代码,但它并不比手动计算每个单元格的高度更糟糕。等待更好的解决方案。
我会写一个帮助程序来查看当前特征集合的垂直大小Class
- (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];
}
每个 UIViewController 都有一个 traitCollection 属性,您可以在代码中使用它。
对于你的情况,你可以这样检查:
if self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact {
return 70;
}
else {
return 90
}
在 portait-only 文字游戏中,我使用静态单元格来显示 IAP 商店:
你可以在上面的 iPhone4 屏幕截图中看到我的问题 - 底部的粉红色按钮(观看视频广告并获得 150 个金币)不可见。
这是我的Xcode截图(请点击fullscreen):
我使用了 7 个静态单元:
- 带有 返回 按钮、标题、钱袋图标的蓝色顶部单元格
- 状态文本(在上面的屏幕截图中不可见)
- 金币包 1
- 金币包 2
- 金币包 3
- 金币包 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 大小 class)。
更新:
到目前为止,我自己的丑陋解决方案是:
@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;
}
作为这种情况下的解决方法,无论如何,单元格数量如此之少,带有子视图容器的滚动视图将完全满足您的需求。我知道更多的代码,但它并不比手动计算每个单元格的高度更糟糕。等待更好的解决方案。
我会写一个帮助程序来查看当前特征集合的垂直大小Class
- (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];
}
每个 UIViewController 都有一个 traitCollection 属性,您可以在代码中使用它。
对于你的情况,你可以这样检查:
if self.traitCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact {
return 70;
}
else {
return 90
}