【问题标题】:Incorrect difference in rendering accessory/disclosure indicator between iOS 12.x and iOS 13.xiOS 12.x 和 iOS 13.x 之间渲染附件/披露指示器的不正确差异
【发布时间】: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


【解决方案1】:

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

一种选择是:不要使用披露指标!只需将您自己的类似指标的符号放在内容视图的右侧中心即可。然后内容视图将填充单元格。

或者,使用云彩和其他视觉材料作为单元格背景。您可以组装一个由包含图像、描述文本和描述背景的普通 UIView 组成的背景,并将backgroundImage 设置为该视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2017-03-02
    • 1970-01-01
    • 2021-10-07
    相关资源
    最近更新 更多