UITableView ImageView 太大

Posted

技术标签:

【中文标题】UITableView ImageView 太大【英文标题】:UITableView ImageView too large 【发布时间】:2013-11-26 23:14:33 【问题描述】:

我有点困惑,为什么我的图片大小不合适。我将 44x44 大小的图像传递给 UITableView,默认行高为 44 像素,但我得到以下结果:

这不是我应该如何设置我的UITableViewCell 图像吗?

 UIImage *imageOne = [UIImage imageNamed:@"sent-indicator@2x.png"];         
 cell.imageView.image = imageOne;

【问题讨论】:

请注意,对于 UIImage imageNamed,不要传递 @2x 或 .png。它将假设 png 并自动做出视网膜/非视网膜决定。 @Apollo 嗨!你能接受我的回答吗? :) 【参考方案1】:

从代码中的图像名称中删除 @2x。系统找到视网膜图像

【讨论】:

【参考方案2】:

一些想法:

    我会在调试器中运行应用程序,点击“暂停”按钮,然后在(lldb) 提示符处键入

    po [[UIWindow keyWindow] recursiveDescription]
    

    这将产生一个很长的神秘日志,但您可以确认确切的屏幕坐标。我想你会发现图像视图是 43 点高。

    (lldb) po [[UIWindow keyWindow] recursiveDescription]
    <UIWindow: 0x8cb45e0; frame = (0 0; 320 480); gestureRecognizers = <NSArray: 0x8cb1ca0>; layer = <UIWindowLayer: 0x8cb2c70>>
       | <UITableView: 0x9031400; frame = (0 0; 320 480); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x8a950c0>; layer = <CALayer: 0x8a92ed0>; contentOffset: 0, 0>
       |    | <UITableViewWrapperView: 0x8a95c10; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x8a95ce0>>
       |    |    | <UITableViewCell: 0x8e9e1b0; frame = (0 440; 320 44); text = 'Row 10'; autoresize = W; layer = <CALayer: 0x8e9d7b0>>
       |    |    |    | <UITableViewCellScrollView: 0x8e9e890; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8e9eb20>; layer = <CALayer: 0x8e9ea60>; contentOffset: 0, 0>
       |    |    |    |    | <UITableViewCellContentView: 0x8e9d7e0; frame = (0 0; 320 43.5); opaque = NO; gestureRecognizers = <NSArray: 0x8e9ee70>; layer = <CALayer: 0x8e9d850>>
       |    |    |    |    |    | <UILabel: 0x8e9e340; frame = (73 0; 232 43.5); text = 'Row 10'; clipsToBounds = YES; layer = <CALayer: 0x8e9e3e0>>
       |    |    |    |    |    | <UIImageView: 0x8e9e620; frame = (15 6; 43 31); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8e9d720>>
       |    |    |    |    | <_UITableViewCellSeparatorView: 0x8e9fb60; frame = (73 43.5; 247 0.5); layer = <CALayer: 0x8e9fbd0>>
       |    |    | <UITableViewCell: 0x8e9d3f0; frame = (0 396; 320 44); text = 'Row 9'; autoresize = W; layer = <CALayer: 0x8e9ca10>>
       |    |    |    | <UITableViewCellScrollView: 0x8e9daf0; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8e9dd80>; layer = <CALayer: 0x8e9dcc0>; contentOffset: 0, 0>
       |    |    |    |    | <UITableViewCellContentView: 0x8e9ca40; frame = (0 0; 320 43.5); opaque = NO; gestureRecognizers = <NSArray: 0x8e9e0d0>; layer = <CALayer: 0x8e9d580>>
       |    |    |    |    |    | <UILabel: 0x8e9d5b0; frame = (73 0; 232 43.5); text = 'Row 9'; clipsToBounds = YES; layer = <CALayer: 0x8e9d650>>
       |    |    |    |    |    | <UIImageView: 0x8e9d880; frame = (15 6; 43 31); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8e9c980>>
       |    |    |    |    | <_UITableViewCellSeparatorView: 0x8e9fa70; frame = (73 43.5; 247 0.5); layer = <CALayer: 0x8e9fae0>>
       |    |    | <UITableViewCell: 0x8e9c620; frame = (0 352; 320 44); text = 'Row 8'; autoresize = W; layer = <CALayer: 0x8e9bc50>>
       |    |    |    | <UITableViewCellScrollView: 0x8e9cd30; frame = (0 0; 320 44); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x8e9cfc0>; layer = <CALayer: 0x8e9cf00>; contentOffset: 0, 0>
       |    |    |    |    | <UITableViewCellContentView: 0x8e9bc80; frame = (0 0; 320 43.5); opaque = NO; gestureRecognizers = <NSArray: 0x8e9d310>; layer = <CALayer: 0x8e9c7b0>>
       |    |    |    |    |    | <UILabel: 0x8e9c7e0; frame = (73 0; 232 43.5); text = 'Row 8'; clipsToBounds = YES; layer = <CALayer: 0x8e9c880>>
       |    |    |    |    |    | <UIImageView: 0x8e9cac0; frame = (15 6; 43 31); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8e9bbc0>>
       |    |    |    |    | <_UITableViewCellSeparatorView: 0x8e9f980; frame = (73 43.5; 247 0.5); layer = <CALayer: 0x8e9f9f0>>
    

    顺便说一下,这是 43 个“点”,而不是“像素”。您可能希望您的 @2x 再现为 86 像素高,而不是 43 像素高。非@2x 再现可以是 43 像素高。

【讨论】:

【参考方案3】:

UITableViewCell 的边框包含在单元格的默认 44 点高度中。这意味着单元格的imageView 属性的默认大小实际上是 40x40 而不是 44x44,以适应这些边框。

有关更多信息,请参阅此答案:https://***.com/a/2122183/740474

【讨论】:

【参考方案4】:

当您指定@2x 时,您正在指定用于视网膜显示器的图像,这意味着 44 x 44 图像实际上在视网膜显示器上被视为 22 x 22。如果您的单元格的高度为 44,那么您的图像应该是 88 像素高。

【讨论】:

以上是关于UITableView ImageView 太大的主要内容,如果未能解决你的问题,请参考以下文章

在 contentView(cell.imageView) 后面隐藏 UITableView 分隔符?

UITableView Cell ImageView问题[重复]

UITableView 单元格中的 imageView 在 touchdown 事件中违反 setClipsToBounds

UITableView 添加 WebView 和 ImageView 单元格

我们是不是应该在将图像设置为 UITableView 中的 imageView 之前缩放图像

iOS如何固定UITableView中cell.imageView.image的图片大小