UITableViewCell 中的 UIImageView 用不同的约束刷新

Posted

技术标签:

【中文标题】UITableViewCell 中的 UIImageView 用不同的约束刷新【英文标题】:UIImageView in UITableViewCell refreshing with different constraints 【发布时间】:2014-09-19 00:06:41 【问题描述】:

这个问题让我困扰了一段时间,我终生无法明白为什么会发生。

我有一个 tableView,里面有自定义单元格。该单元格在左上角有一个 imageView,然后是从 plist 中查找的各种信息。我正在使用自动布局来设置所有元素的位置。我已经刷新了所有的约束,所以它们都被更新了。见下文:

当我向下滚动视图并且单元格离开屏幕时,就会出现问题。我正在对它们进行出队,因此每次它们都会刷新。

BSettingsCell * cell = [tableView_ dequeueReusableCellWithIdentifier:bSettingsCellIdentifier];

当它们刷新时,尽管它们现在绑定的约束不起作用。 imageview 为 60x60 像素,图像为 120x120 像素,命名为 fruitMainImage@2x.png 以考虑视网膜屏幕。

我在图片周围设置了一个红色边框,以便更容易看到正在发生的事情。如您所见,图像在刷新后由于某种原因向下移动。

我已尝试切换到框架布局以将其固定到位,但这不起作用。

我发现this*** 问题似乎提出了同样的问题,但只是将其作为一个问题提出,而不是帮助解决这个问题。

任何帮助将不胜感激,因为如果有简单的修复方法,我不喜欢用 keeplayout 重写所有代码。

编辑:

这是我的 cellForRowAtIndex 方法:

- (UITableViewCell *)tableView:(UITableView *)tableView_ cellForRowAtIndexPath:(NSIndexPath *)indexPath 

    BSettingsCell * cell = [tableView_ dequeueReusableCellWithIdentifier:bSettingsCellIdentifier];

    NSDictionary * dict = [_settingsData objectForKey:_settingsPacks[indexPath.row]];

    cell.nameLabel.text = [dict objectForKey:bSettingsName];
    cell.byLabel.text = [dict objectForKey:bArtist];
    cell.stickerImageView.image = [UIImage imageNamed:[dict objectForKey:bImage]];

    // To make it obvious that the view is changing position
    cell.stickerImageView.layer.borderColor = [UIColor redColor].CGColor;
    cell.stickerImageView.layer.borderWidth = 2;

    cell.descriptionView.text = [dict objectForKey:bDescription];

    [cell.linkButton setTitle: [dict objectForKey:bLink] forState: UIControlStateNormal];
    cell.linkButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;

还有一张 XIB 文件中自动布局约束的照片:(请注意,虽然屏幕截图中没有包含名称和标签,但与约束保持一致)

【问题讨论】:

图像视图的顶部空间和前导空间是否指向其父视图? 那么,您是说您的图像视图的属性名称不是 imageView (这是您提供的链接中提到的问题)? 是的,超级视图的顶部空间是 8,超级视图的前导空间是 6。这两个和宽度和高度等于 60 是四个约束 @property (nonatomic, weak) IBOutlet UIImageView *stickerImageView; 我在您发布的内容中看不到任何可能导致此问题的内容。也许发布你的整个 cellForRowAtIndexPath 方法。 【参考方案1】:

你试过用吗

BSettingsCell * cell = [tableView_ dequeueReusableCellWithIdentifier:bSettingsCellIdentifier forIndexPath: indexPath];

改为?

【讨论】:

这似乎没有任何区别【参考方案2】:

虽然解决方案很普通,但它确实对我有帮助,所以我会在这里发布。

基本上解决方案是删除我所做的并在每个步骤中添加它。尽管最后它看起来完全一样,但它确实有效。我认为有时会有 bug 潜入 Xcode 并导致问题。通常只需重置工作即可解决这些问题。

当我试图解决这个问题时,我假设错误出现在我的代码中,我可能花了太长时间试图找到错误。最后花几分钟重做 a) 通常可以让您看到错误,因为您可以看到错误的步骤 b) 它可以重置由 Xcode 引起的任何错误。

希望这对以后遇到类似挫折的人有所帮助

【讨论】:

以上是关于UITableViewCell 中的 UIImageView 用不同的约束刷新的主要内容,如果未能解决你的问题,请参考以下文章

Xcode (Swift) 中的 UI:我只想要 UIStackView 的折叠功能,而不是标准化间距。还值得用吗?

UIView 上的顶部空间约束,而不是 UIImag

UITableViewCell 中的 UIDatePicker 更新 UITableViewCell 文本标签

更改 UITableViewCell 中的对象也更改了重用 UITableViewCell 的对象

确定 UITableViewCell 中的 UIButton

UITableViewCell 事件中的 UIButton 不起作用