【问题标题】:UItableViewCell imageview changing on selectUItableViewCell imageview 在选择时改变
【发布时间】:2012-07-25 17:55:00
【问题描述】:

我正在使用 webcache 加载 facebook 用户列表,它的效果非常好。在您选择其中一个单元格之前,它似乎改变了内容模式,或者更有可能改变了 uiimageview 框架的大小,但基于图片的实际大小。为了清楚起见,这里有一些屏幕

在这里加载 http://img.photobucket.com/albums/v246/homojedi/Screenshot20120727114807.png

在选择某些图像时,您可以看到它们似乎跳到了原来的样子。 http://img.photobucket.com/albums/v246/homojedi/Screenshot20120727114827.png

正如预期的那样,如果我将它们滚动出屏幕并返回它们,它们会恢复到开始时的状态。

真是莫名其妙。我唯一没有尝试过的是将 uitableView 子类化并在那里设置其布局子视图。除了这些,我还能做什么?

编辑:请求代码

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // typically you need know which item the user has selected.
    // this method allows you to keep track of the selection
    _indexPath = indexPath;

    [_indexPath retain];
}

【问题讨论】:

  • 你能把tableView:didSelectCellAtIndexPath:的代码贴出来吗?
  • 我没有实现那个方法,存在吗?我确实有这个 - (void)tableView:tableView didSelectRowAtIndexPath 并且它本质上是空的,我所做的只是保留索引路径以供以后使用。
  • 你解决了吗?我现在正在处理同样的问题,任何帮助都会很高兴!
  • 我遇到了同样的问题,但我使用的是标准的 tableView(即没有自定义视图),尝试了上述所有解决方案,但它们对我不起作用。知道为什么吗?

标签: ios uitableview uiimageview


【解决方案1】:

我相信您的问题是由于 UIImageView。您应该设置一次图像 - cell.imageView.image = myImage。不要设置 highlightImage。设置 contentMode 以保持图像的纵横比:cell.imageView.contentMode = UIViewContentModeScaleAspectFit;,并验证 contentStretch rect 是 0,0,1,1(默认值)。

tableView 可能会在被选中时更改 UIImageView 或其框架的 contentMode(谁知道原因)。我会将 NSLogs 添加到 willSelectRowAtIndexPath 和 didSelectRowAtIndexPath 中,显示相同的信息:imageView 框架、contentMode 值(作为整数)等。这些值中的一个或多个在选择时会发生变化。

【讨论】:

    【解决方案2】:

    按照 sebastian-Luczak 的要求,我确实提出了调整大小的解决方案,但现在图像质量不一致,只有当你触摸它时它才会获得更高的分辨率,奇怪但没有那么糟糕或引人注目,无论如何这里是代码.

    注意我正在使用SDWebImage异步加载图片

    [cell.imageView setImageWithURL:[NSURL URLWithString:path] placeholderImage:[UIImage imageNamed:@"Icon.png"]success:^(UIImage *image) 
     {
         cell.imageView.image = [image resizeImage:image newSize:CGSizeMake(38, 38)];
    
     } failure:^(NSError *error) 
     {
    
     }];
    

    【讨论】:

      【解决方案3】:

      我遇到了这个问题,我解决了!!!

      检查以确保您在自定义 TableViewCell 中合成了 imageView 属性。

      我忘记合成一个属性(导致 IBOutlet 没有 getter/setter)。

      这个话题很老,但希望对其他人有所帮助!

      【讨论】:

      • 这个解决方案对我有用,我们有什么理由必须手动合成属性。从 xcode 4.4 开始,合成应该是可选的。
      【解决方案4】:

      // 如果你继承 UITableViewCell 你可以摆脱这个问题

      - (void)layoutSubviews {
      
          [super layoutSubviews];
          self.imageView.bounds = CGRectMake(10,5,65,65);
          self.imageView.frame = CGRectMake(10,5,65,65);
          self.imageView.contentMode = UIViewContentModeScaleAspectFit;
      
      }
      

      【讨论】:

        【解决方案5】:

        我遇到了和你一样的问题,我解决了

        问题是由您将 imageView 命名为“imageView”引起的

        不知道为什么

        如果您将 imageView 名称更改为“m_imageView”

        问题已解决

        一切都是为了命名!

        【讨论】:

        • 看起来 UITableViewCell 也已经有一个内部属性imageView,这可以解释为什么行为会变得奇怪。
        • 这也是我的名字。迷惑了我几个小时,即使设置了新名称,我也忘记取消旧名称的链接,所以仍然出现错误。所以不要那样做!
        • 我不明白这个解决方案。如果你使用 UITableViewCell,它有一个 imageView,你不需要命名它。你们是在向单元格添加自己的附加图像视图吗?
        • 我的上帝。我花了半天的时间认为这是一个导致这种荒谬布局的约束问题。我被警告要命名UIImageViewimageView,但我没有删除引用的插座。
        • 在我的情况下,UILAbel 正在移动,因为我在调试器之后离开了 XIB 对“textLabel”的引用。告诉我我无法覆盖 UITableViewCell 的 textLabel。该单元格可能识别出填充了 UILabel“textLabel”并试图重绘它。
        【解决方案6】:

        以防万一其他人,比如我,遇到以上方法都不起作用的问题。

        我也将我的UIImageView命名为:imageView但是,出于某种原因,即使在重命名后,问题仍然存在。 我尝试了所有我能想到的方法,重置模拟器、清理项目、添加删除约束......

        事实证明,只需从情节提要中删除UIImageView拖动一个新的即可修复它。

        不可能是预编译问题,因为我清理了项目。去图吧。

        【讨论】:

        • 这个工作的原因很可能与 Jakehao 的回答相同:你仍然有一个旧的 IBOutlet 到 imageView 加密狗在那里。好吧,删除视图并替换它是摆脱它的一种方法。尽管如此,它确实帮助了我,所以我的赞成票,先生。 :)
        【解决方案7】:

        添加关于命名问题的答案:

        如前所述,图像视图的问题即使在重命名后仍然存在。但不需要从您的 xib 或情节提要中删除 UIImageView。您可以简单地按住 ctrl 并单击图像视图并删除与仍然存在的属性 imageView 的连接。

        imageView 的链接仍然存在的原因似乎是 imageView 属性在您在代码中删除后仍然可用。它仍然存在,因为它继承自 UITableViewCell

        最后一个提示听起来很愚蠢,但我花了几分钟才意识到:显然所有使用属性名称imageView 的代码仍然可以工作,但会导致奇怪的行为!因此,请仔细检查是否没有使用旧属性名称的代码。

        【讨论】:

          【解决方案8】:
          // reason for this problem is UITableView cell's imageview initially has a default size later on it resize it self on select so following cab be a solution for this: (Using AFNetworking to set image/ You can adjust accordingly)
          
                      __weak UItableViewCell *cellTemp = cell;
          
                      [cell.imageView setImageWithURLRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:strURL]]
                                            placeholderImage:[UIImage imageNamed:@"placeholder"]
                  success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
                      {
                          cellTemp.imageView.image = image;
          
                          CGRect frameRect = cellTemp.imageView.frame;
                          frameRect.origin.y = (cellTemp.frame.size.height - image.size.height)/2;
                          frameRect.size.width = image.size.width;
                          frameRect.size.height = image.size.height;
                          cellTemp.imageView.frame = frameRect;
          
                          [cellTemp layoutSubviews]; 
              // this will fit your cell's label
          
                      }
                  failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
                      {
          
                      }];
          

          【讨论】:

          • 如果您不想自定义大小,只需使用 [cellTemp layoutSubviews];在单元格的图像视图中设置图像后。
          【解决方案9】:

          我遇到过这个问题,但我的自定义 UITableViewCell 中没有 imageView 属性。

          事实上,我确实犯了一个愚蠢的错误,即从我的 imageView 对象连接一个额外的 IBOutlet 到 UITableViewCell 的默认 imageView 属性。这是因为我最初将我的图像视图命名为imageView,但后来我更改了它并忘记了插座。

          取下插座后,一切正常。

          【讨论】:

          • 这个问题浪费了我几个小时的生命。感谢您帮我找到它!
          • 遇到了完全相同的问题。谢谢!
          • 是的,非常感谢。完全一样的事情......有几个小时,至少我得到了这个?
          • 天哪。这太反直觉了。我讨厌自动布局,但这只是随机的!感谢您的修复。
          【解决方案10】:

          我遇到了同样的问题,即使在尝试了所有以前的答案之后,他们都没有解决。后来我发现 UITableViewController 有多个未使用的 Outlets,因此删除未使用的 Outlets 解决了问题。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-24
            • 1970-01-01
            • 2010-12-23
            • 1970-01-01
            • 2023-03-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多