iOS 12.x 和 iOS 13.x 之间 accessory/disclosure 指标的渲染差异不正确

Incorrect difference in rendering accessory/disclosure indicator between iOS 12.x and iOS 13.x

在我开发并在App Store上销售的一个应用中,当运行,从iOS13开始,应用自定义table中使用的披露附件的背景区域单元格不是透明的,覆盖单元格其余部分的内容,t运行覆盖图像的右侧,在某些情况下t运行覆盖下方描述区域的文本。我已经“证明”通过在 Xcode 并使用它构建应用程序。 运行 12.4 模拟器上的应用程序,披露附件正确显示,因为它自开发此应用程序开始以来一直如此。

下面的屏幕截图显示了公开区域在 13.x(第一个屏幕截图)之前应该如何显示以及过去如何显示,以及它现在从 13.x(第二个屏幕截图)开始显示的方式:

我能找到的最接近的 SO post 并没有帮助我解决这个问题: Altering the background color of cell.accessoryView and cell.editingAccessoryView

我在设置此自定义单元格时尝试添加以下内容,但没有达到预期效果: cell.accessoryView.backgroundColor = [UIColor clearColor];

感谢任何有关如何解决此问题的指导。


根据最初的论坛建议编辑以下内容。


请注意,我已经很多年没有碰过这段代码了,所以不知道为什么图像和标签会发生变化。无论如何,我确实尝试编辑图像视图和标签以与 xib 中单元配置的边界对齐。还尝试调整图像视图和标签的大小以不覆盖披露区域,但应用程序渲染没有变化。尝试过查看调试器,但所有选项都显示为灰色。抱歉,我之前没有处理过。

(问题:披露图标右侧的灰色垂直条表示什么?)

加载到视图控制器单元格中的 .xib 屏幕截图,显示图像视图和标签句柄:

来自视图控制器的代码设置 table 单元格:

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

内容视图现在从披露指示器中缩小。图像视图和其他视图在内容视图中。所以他们的右边缘向左移动了。

一个选择是:不要使用披露指标!只需将您自己的 indicator-like 符号放在内容视图的 right-center 处即可。然后内容视图将填充单元格。

否则,使用云彩和其他视觉效果 material 作为单元格背景。您可以 assemble 一个由包含图像、desc 文本和 desc 背景的纯 UIView 组成的背景,并将 backgroundImage 设置为该视图。