web-dev-qa-db-ja.com

UITableViewCellのimageViewは40x40に適合

TableViewとdetailViewで同じ大きな画像を使用しています。 imageViewをtableViewに表示するときに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を使用しています。

25
slatvick

NS-ExtensionsファイルにBenのコードを拡張機能として配置し、次のように、任意の画像に自分自身のサムネイルを作成できるようにします。

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
32
PapaSmurf

その場で縮小された大きな画像を使用するとメモリを大量に消費するため、サムネイルバージョンをキャッシュします。

これが私のサムネイルコードです。

- (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)を変更する場合は、キャッシュされたサムネイルを適切にクリアしてください。

12
Ben Lachman

私はUIViewに包まれており、このコードを使用しています:

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

(自分が欲しい寸法のラッパーUIView-私は AsyncImageView を使用します)。

4
alex_c

その場でではなく、事前にサムネイルを生成するという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];
}
2
guiller