【问题标题】:UITableViewCell's imageView fit to 40x40UITableViewCell 的 imageView 适合 40x40
【发布时间】:2010-11-06 12:43:52
【问题描述】:

我在 tableView 和 detailView 中使用相同的大图像。 需要在 tableView 中显示图像时使 imageView 填充 40x40,但在半个屏幕上拉伸。我玩了几个属性,但没有积极的结果:

[cell.imageView setBounds:CGRectMake(0, 0, 50, 50)];
[cell.imageView setClipsToBounds:NO];
[cell.imageView setFrame:CGRectMake(0, 0, 50, 50)];
[cell.imageView setContentMode:UIViewContentModeScaleAspectFill];

我正在使用带有“预定义样式中的单元格对象”的 SDK 3.0。

【问题讨论】:

  • 我也有这个问题。我也试过 imageView.contentMode = UIViewContentModeScaleAspectFit.

标签: objective-c iphone uitableview uiimageview


【解决方案1】:

你可以用这个吗?

yourTableViewController.rowImage = [UIImage imageNamed:@"yourImage.png"];

和/或

cell.image = yourTableViewController.rowImage;

如果您的图像已经是 40x40,那么您不必担心设置边界和其他东西......但是,我也是新手,所以,我不知道,没有玩过表格视图行/单元格图像很多

希望这会有所帮助。

【讨论】:

  • 不,这不是我需要的。我需要使用大图像。
  • 他的意思是改变大小,虽然你设置图像是正确的。
【解决方案2】:

我能够使用界面生成器和 tableviewcell 来完成这项工作。您可以将图像视图的“模式”属性设置为“Aspect Fit”。我不确定如何以编程方式执行此操作。

【讨论】:

  • 这就是您将如何以编程方式执行此操作:yourTableViewCell.imageView.contentMode = UIViewContentModeScaleAspectFit;
  • 当然可以,但是使用 IB 只是为了改变图像的大小会产生很多开销
【解决方案3】:

尝试设置UIImageView.autoresizesSubviews 和/或UIImageView.contentStretch

【讨论】:

    【解决方案4】:

    我将我的包裹在 UIView 中并使用以下代码:

    imageView.contentMode = UIViewContentModeScaleAspectFit;
    imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;
    [self addSubview:imageView];
    imageView.frame = self.bounds;
    

    (self 是包装 UIView,具有我想要的尺寸 - 我使用 AsyncImageView)。

    【讨论】:

      【解决方案5】:

      我缓存缩略图版本,因为使用动态缩小的大图像会占用太多内存。

      这是我的缩略图代码:

      - (UIImage *)thumbnailOfSize:(CGSize)size {
          if( self.previewThumbnail )
              return self.previewThumbnail; // returned cached thumbnail
      
          UIGraphicsBeginImageContext(size);
      
          // draw scaled image into thumbnail context
          [self.preview drawInRect:CGRectMake(0, 0, size.width, size.height)];
      
          UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();    
      
          // pop the context
          UIGraphicsEndImageContext();
      
          if(newThumbnail == nil) 
              NSLog(@"could not scale image");
      
          self.previewThumbnail = newThumbnail;
      
          return self.previewThumbnail;
      }
      

      如果您更改原始图像(在我的情况下为 self.preview),请确保正确清除缓存的缩略图。

      【讨论】:

      • 我把这个放在哪里?另外,self.previewThumbnail 是 UIImage 吗?最后,什么是self.preview?一个图像,一个视图?
      • 这很棒,但是具有相应布局设置的自定义单元格不是更有效吗?
      • 我不确定这有什么关系?您绝对可以在自定义单元格中使用此代码。它只是从更大的图像中创建一个缩略图。
      • @zardon 这是我的一个模型类中的一个方法(它有一个“预览”UIImage)。您必须对其进行一些编辑才能将其添加到您自己的模型类中,或者至少添加一个名为 previewThumbnail 的成员属性以用于缓存。
      【解决方案6】:

      我认为 Ben Lachman 提前而不是即时生成缩略图的建议很聪明,因此我修改了他的代码,以便它可以处理整个数组并使其更便携(没有硬编码的属性名称)。

      - (NSArray *)arrayOfThumbnailsOfSize:(CGSize)size fromArray:(NSArray*)original {
          NSMutableArray *temp = [NSMutableArray arrayWithCapacity:[original count]];
          for(UIImage *image in original){
              UIGraphicsBeginImageContext(size);
              [image drawInRect:CGRectMake(0,0,size.width,size.height)];
              UIImage *thumb = UIGraphicsGetImageFromCurrentImageContext();
              UIGraphicsEndImageContext();
              [temp addObject:thumb];
          }
          return [NSArray arrayWithArray:temp];
      }
      

      【讨论】:

        【解决方案7】:

        我将 Ben 的代码作为扩展名放在我的 NS-Extensions 文件中,这样我就可以告诉任何图像制作自己的缩略图,如下所示:

        UIImage *bigImage = [UIImage imageNamed:@"yourImage.png"];
        UIImage *thumb = [bigImage makeThumbnailOfSize:CGSizeMake(50,50)];
        

        这是.h文件:

        @interface UIImage (PhoenixMaster)
        - (UIImage *) makeThumbnailOfSize:(CGSize)size;
        @end
        

        然后在 NS-Extensions.m 文件中:

        @implementation UIImage (PhoenixMaster)
        - (UIImage *) makeThumbnailOfSize:(CGSize)size
        {
            UIGraphicsBeginImageContextWithOptions(size, NO, UIScreen.mainScreen.scale);
            // draw scaled image into thumbnail context
            [self drawInRect:CGRectMake(0, 0, size.width, size.height)];
            UIImage *newThumbnail = UIGraphicsGetImageFromCurrentImageContext();        
            // pop the context
            UIGraphicsEndImageContext();
            if(newThumbnail == nil) 
                NSLog(@"could not scale image");
            return newThumbnail;
        }
        
        @end
        

        【讨论】:

        • 对于 Retina 显示器,使用 UIGraphicsBeginImageContextWithOptions() 以避免模糊调整大小。 :)
        • @toblerpwn 的注释很重要,因此我编辑了答案以反映这一点。无论屏幕比例如何,它现在都可以正常工作。
        • @chaiguy 为什么我得到一个不可见的界面,因为''声明选择器'drawInRect''?请帮助
        • @Mediyum 确保您在 UIImage 类上声明类别,该类定义了 drawInRect
        猜你喜欢
        • 2011-05-11
        • 2018-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多