【发布时间】:2020-08-14 17:38:43
【问题描述】:
在我开发并在 App Store 中销售的一款应用中,在运行时,从 iOS 13 开始,应用的自定义表格单元格中使用的披露附件的背景区域不透明,覆盖了单元格其余部分的内容,截断图像的右侧,并在某些情况下截断下部描述区域中的文本。通过在 Xcode 中加载 v12.4 模拟器并使用它构建应用程序,我已经“证明”了从 iOS 12.x 到 iOS 13.x 披露附件呈现的这种变化。在 12.4 模拟器上运行该应用程序,显示附件正确显示,自开发此应用程序以来一直如此。
以下屏幕截图显示了披露区域在 13.x 之前应该和过去如何显示(第一个屏幕截图)以及从 13.x 开始它现在如何显示(第二个屏幕截图):
我能找到的最接近的 SO 帖子并没有帮助我解决这个问题: Altering the background color of cell.accessoryView and cell.editingAccessoryView
当我将此自定义单元格设置为未达到预期效果时,我尝试添加以下内容: cell.accessoryView.backgroundColor = [UIColor clearColor];
感谢有关如何解决此问题的任何指导。
根据最初的论坛建议编辑以下内容。
请注意,我已经很多年没有接触过这段代码了,所以不知道为什么图像和标签会发生变化。无论如何,我确实尝试编辑图像视图和标签以与 xib 中单元格配置的边框对齐。还尝试调整图像视图和标签的大小,使其不覆盖显示区域,但应用程序渲染没有变化。尝试查看调试器,但所有选项都显示为灰色。抱歉,我之前没有处理过这个问题。
(问题:披露图标右侧的灰色竖条表示什么?)
.xib 的屏幕截图加载到视图控制器单元格中,并显示图像视图和标签句柄:
视图控制器设置表格单元格的代码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"CloudIndexCell";
CloudIndexCell *cell = (CloudIndexCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle]
loadNibNamed:@"CloudIndexCell"
owner:nil options:nil];
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (CloudIndexCell *) currentObject;
break;
}
}
}
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
if (cell == nil) {
NSArray *topLevelObjects = [[NSBundle mainBundle]
loadNibNamed:@"CloudIndexCell~iPad"
owner:nil options:nil];
for (id currentObject in topLevelObjects){
if ([currentObject isKindOfClass:[UITableViewCell class]]) {
cell = (CloudIndexCell *) currentObject;
break;
}
}
}
}
if (cell == nil) {
cell = [[CloudIndexCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
}
NSDictionary *sectionDict = [cloudsArray objectAtIndex:[indexPath section]];
NSArray *rows = [sectionDict objectForKey:cloudsIndexViewControllerRowsKey];
NSDictionary *rowDict = [rows objectAtIndex:[indexPath row]];
NSString *cloudName = [rowDict objectForKey:cloudsIndexViewControllerCloudNameKey];
NSString *cloudIndexDesc = [rowDict objectForKey:cloudsIndexViewControllerCloudIndexDescriptionKey];
cell.cloudName.text = cloudName;
cell.cloudDescText.text = cloudIndexDesc;
if ([indexPath section] == 0) {
cell.cloudDescBackground.backgroundColor = UIColorFromRGB(0x03AC03);
}
if ([indexPath section] == 1) {
cell.cloudDescBackground.backgroundColor = UIColorFromRGB(0x7C4DD6);
}
if ([indexPath section] == 2) {
cell.cloudDescBackground.backgroundColor = UIColorFromRGB(0xD79A00);
}
if ([indexPath section] == 3) {
cell.cloudDescBackground.backgroundColor = UIColorFromRGB(0x666666); //[UIColor darkGrayColor];
}
cell.cloudImage.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@_Index.png", cloudName]];
return cell;
}
【问题讨论】:
-
披露附件没问题。它是透明的。就是细胞的布局方式发生了变化。图像的边缘已移动。使用查看调试器,您将看到!显示您构建单元格的代码,我们可以提供帮助。
-
请参阅对原始帖子的修改以作为回应。谢谢。
-
因此看起来至少图像视图被固定在
contentView的边界上。但contentView确实在有披露附件时会收缩。因此,正在发生的事情是意料之中的。我建议您将图像视图设为单元格的backgroundView。这样它将覆盖整个背景,这就是你想要的。 -
这在一定程度上有所帮助。我实现了 cell.backgroundView = cell.cloudImage;就在返回单元之前;在帖子中包含的代码的底部。这扩大了整个单元格的图像显示,同时仍然显示了很棒的披露图标。但是 cell.cloudDescText;和图像下方的 cell.cloudDescBackground 分配,其标签也被扩展,就像 xib 中的图像完全跨单元格一样,仍然被截断到与以前相同的程度。
-
如果你想让它们横跨整个单元格,它们也需要在
backgroundImage中。您需要组装一个包含图像、描述文本和描述背景的普通 UIView 组成的背景图像,并将backgroundImage设置为该视图。
标签: uitableview ios13 ios12 accessoryview