iOS 7 和 iOS 8 中的动态单元格高度 - 我可以只支持 iOS 7 中的 heightForRowAtIndexPath 吗?
Dynamic cell height in iOS 7 and iOS 8 - can I only support heightForRowAtIndexPath in iOS 7?
我有一个 table 视图,其中包含动态调整大小的单元格。这在 iOS 8 中非常有效,但在 iOS 7 中不受支持。我需要实施 tableView:heightForRowAtIndexPath 否则应用程序将在 iOS 7 中崩溃。如果我这样做,我将不得不计算单元格的高度。问题是,如果我实施此方法,iOS 8 会注意它并且不再执行其动态大小的单元格魔术。有没有办法只对 iOS 7 个客户端实施此方法?
我以前用过类似的东西:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"CellIdentifier"];
// Stuff & Things
[cell.contentView setNeedsLayout];
[cell.contentView layoutIfNeeded];
return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
}
来自 iOS 8 的新内部自动布局自适应单元格无法神奇地反映回 iOS 7。但这不是问题。如果你想向后兼容 iOS 7,那么,正如你所说的那样,这意味着你将自己确定单元格高度,这样你就可以 return 来自 [=10] 的正确值=].这就是我们在 iOS 4、5、6 和 7 中所做的。这在 iOS 8 中仍然有效(而且可能更快)。
所以我的建议是:编写代码就好像 iOS 7. 如果你在 Objective-C 中编码,你 可以 有两个不同的代码集(条件编译),甚至在 Swift 中,您 可以 使用两个不同的 类,这取决于我们发现自己所在的系统;但我认为这有点过头了 - 这是一个等待发生的代码维护噩梦。
我在调试日志中收到 UIViewAlertForUnsatisfiableConstraints
错误。
Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "" )
如果没有 tableView:heightForRowAtIndexPath:
,单元格看起来没问题。所以,我想在iOS8中禁用它。@batu在另一个post中给出了解决方案:Implement heightForRowIndexPath: in iOS 7, but remove it in iOS 8 using compile-time macro。感谢@batu,解决方案就这么简单:
#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
-(CGFloat) tableView: (UITableView * ) tableView heightForRowAtIndexPath: (NSIndexPath * ) indexPath {
if (IS_IOS_8_OR_LATER) {
return UITableViewAutomaticDimension;
}
// Your iOS 7 code here.
}
但是,我的手机在iOS8和iPhone6的高度仍然有问题。原因似乎是 UILabel 的固定宽度(专为 320pt 而设计)。这是我经过一夜的研究后所做的:
我应用了本指南中的解决方案:Dynamic Table View Cell Height and Auto Layout。
由于 UILabel 需要 iOS 7 设备的显式宽度,我以编程方式 "clear" iOS 8 的此设置。在我的扩展 table查看单元格:
- (void)awakeFromNib {
// Initialization code
if (IS_IOS_8_OR_LATER) {
self.descriptionLabel.preferredMaxLayoutWidth = 0;
}
}
我使用了指南中的 RWLabel
建议。
我禁用return UITableViewAutomaticDimension;
。是否启用或禁用,可能取决于 table 视图单元格中的子视图和约束。尽量配合你的情况。
我将所有 RWLabel 的 Trailing Space 的优先级更改为 999(而不是 1000)。这消除了不可满足的约束警告。
希望这些解决方案对某人有所帮助。
我有一个 table 视图,其中包含动态调整大小的单元格。这在 iOS 8 中非常有效,但在 iOS 7 中不受支持。我需要实施 tableView:heightForRowAtIndexPath 否则应用程序将在 iOS 7 中崩溃。如果我这样做,我将不得不计算单元格的高度。问题是,如果我实施此方法,iOS 8 会注意它并且不再执行其动态大小的单元格魔术。有没有办法只对 iOS 7 个客户端实施此方法?
我以前用过类似的东西:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [self dequeueReusableCellWithIdentifier:@"CellIdentifier"];
// Stuff & Things
[cell.contentView setNeedsLayout];
[cell.contentView layoutIfNeeded];
return [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;
}
来自 iOS 8 的新内部自动布局自适应单元格无法神奇地反映回 iOS 7。但这不是问题。如果你想向后兼容 iOS 7,那么,正如你所说的那样,这意味着你将自己确定单元格高度,这样你就可以 return 来自 [=10] 的正确值=].这就是我们在 iOS 4、5、6 和 7 中所做的。这在 iOS 8 中仍然有效(而且可能更快)。
所以我的建议是:编写代码就好像 iOS 7. 如果你在 Objective-C 中编码,你 可以 有两个不同的代码集(条件编译),甚至在 Swift 中,您 可以 使用两个不同的 类,这取决于我们发现自己所在的系统;但我认为这有点过头了 - 这是一个等待发生的代码维护噩梦。
我在调试日志中收到 UIViewAlertForUnsatisfiableConstraints
错误。
Unable to simultaneously satisfy constraints. Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "", "", "" )
如果没有 tableView:heightForRowAtIndexPath:
,单元格看起来没问题。所以,我想在iOS8中禁用它。@batu在另一个post中给出了解决方案:Implement heightForRowIndexPath: in iOS 7, but remove it in iOS 8 using compile-time macro。感谢@batu,解决方案就这么简单:
#define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
-(CGFloat) tableView: (UITableView * ) tableView heightForRowAtIndexPath: (NSIndexPath * ) indexPath {
if (IS_IOS_8_OR_LATER) {
return UITableViewAutomaticDimension;
}
// Your iOS 7 code here.
}
但是,我的手机在iOS8和iPhone6的高度仍然有问题。原因似乎是 UILabel 的固定宽度(专为 320pt 而设计)。这是我经过一夜的研究后所做的:
我应用了本指南中的解决方案:Dynamic Table View Cell Height and Auto Layout。
由于 UILabel 需要 iOS 7 设备的显式宽度,我以编程方式 "clear" iOS 8 的此设置。在我的扩展 table查看单元格:
- (void)awakeFromNib { // Initialization code if (IS_IOS_8_OR_LATER) { self.descriptionLabel.preferredMaxLayoutWidth = 0; } }
我使用了指南中的
RWLabel
建议。我禁用
return UITableViewAutomaticDimension;
。是否启用或禁用,可能取决于 table 视图单元格中的子视图和约束。尽量配合你的情况。我将所有 RWLabel 的 Trailing Space 的优先级更改为 999(而不是 1000)。这消除了不可满足的约束警告。
希望这些解决方案对某人有所帮助。