26

私はこれUIImageViewを持っており、その最大の高さと最大の幅の値を持っています。私が達成したいのは、(任意のアスペクト比と任意の解像度で)画像を撮り、境界線に収まるようにしたいので、画像がそれらを超えないようにしますが、必要に応じて縮小することができます。(写真で赤でマークされています):

ここに画像の説明を入力してください

現在、画像は必要なサイズに適切に適合していますが、2つの心配があります:1。UIImageViewサイズ変更された画像のサイズと等しくないため、背景が赤のままになります(そして私はそれを望まない)2。画像が小さい場合私の高さはUIImageView小さくなりませんが、同じ高さのままです。

これが私のコードです、そして私はそれが間違っていることを知っています:

UIImage *actualImage = [attachmentsArray lastObject];
UIImageView *attachmentImageNew = [[UIImageView alloc] initWithFrame:CGRectMake(5.5, 6.5, 245, 134)];
attachmentImageNew.image = actualImage;
attachmentImageNew.backgroundColor = [UIColor redColor];
attachmentImageNew.contentMode = UIViewContentModeScaleAspectFit;

UIImageView.imageでは、のサイズだけでなく、全体のサイズを動的に変更しUIImageViewて、そのサイズをコンテンツに合わせて完全に調整するにはどうすればよいでしょうか。どんな助けでも大歓迎です、ありがとう!

4

7 に答える 7

34

サイズ変更された画像の幅と高さを取得する場合UIViewContentModeScaleAspectFitの後にサイズ変更された画像の幅を取得すると、imageViewのサイズを変更できます。

imageView.frame = CGRectMake(0, 0, resizedWidth, resizedHeight);
imageView.center = imageView.superview.center;

動作するかどうかは確認していませんが、大丈夫だと思います

于 2013-02-01T15:48:54.710 に答える
25
- (UIImage *)image:(UIImage*)originalImage scaledToSize:(CGSize)size
{
    //avoid redundant drawing
    if (CGSizeEqualToSize(originalImage.size, size))
    {
        return originalImage;
    }

    //create drawing context
    UIGraphicsBeginImageContextWithOptions(size, NO, 0.0f);

    //draw
    [originalImage drawInRect:CGRectMake(0.0f, 0.0f, size.width, size.height)];

    //capture resultant image
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    //return image
    return image;
}
于 2013-02-01T16:32:07.250 に答える
9

これは、拡張機能を使用した、Rajneesh071の回答に相当するSwiftです。

UIImage {
  func scaleToSize(aSize :CGSize) -> UIImage {
    if (CGSizeEqualToSize(self.size, aSize)) {
      return self
    }

    UIGraphicsBeginImageContextWithOptions(aSize, false, 0.0)
    self.drawInRect(CGRectMake(0.0, 0.0, aSize.width, aSize.height))
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
  }
}

使用法:

let image = UIImage(named: "Icon")
item.icon = image?.scaleToSize(CGSize(width: 30.0, height: 30.0))
于 2016-08-20T03:08:56.513 に答える
4

以下のカテゴリを使用して、Quartzの境界線を画像に適用します。

[yourimage.layer setBorderColor:[[UIColor whiteColor] CGColor]];
[yourimage.layer setBorderWidth:2];

カテゴリ:UIImage + AutoScaleResize.h

#import <Foundation/Foundation.h>

@interface UIImage (AutoScaleResize)

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize;

@end

UIImage + AutoScaleResize.m

#import "UIImage+AutoScaleResize.h"

@implementation UIImage (AutoScaleResize)

- (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize
{
    UIImage *sourceImage = self;
    UIImage *newImage = nil;
    CGSize imageSize = sourceImage.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    CGFloat targetWidth = targetSize.width;
    CGFloat targetHeight = targetSize.height;
    CGFloat scaleFactor = 0.0;
    CGFloat scaledWidth = targetWidth;
    CGFloat scaledHeight = targetHeight;
    CGPoint thumbnailPoint = CGPointMake(0.0,0.0);

    if (CGSizeEqualToSize(imageSize, targetSize) == NO)
    {
        CGFloat widthFactor = targetWidth / width;
        CGFloat heightFactor = targetHeight / height;

        if (widthFactor > heightFactor)
        {
            scaleFactor = widthFactor; // scale to fit height
        }
        else
        {
            scaleFactor = heightFactor; // scale to fit width
        }

        scaledWidth  = width * scaleFactor;
        scaledHeight = height * scaleFactor;

        // center the image
        if (widthFactor > heightFactor)
        {
            thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5;
        }
        else
        {
            if (widthFactor < heightFactor)
            {
                thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5;
            }
        }
    }

    UIGraphicsBeginImageContext(targetSize); // this will crop

    CGRect thumbnailRect = CGRectZero;
    thumbnailRect.origin = thumbnailPoint;
    thumbnailRect.size.width  = scaledWidth;
    thumbnailRect.size.height = scaledHeight;

    [sourceImage drawInRect:thumbnailRect];

    newImage = UIGraphicsGetImageFromCurrentImageContext();

    if(newImage == nil)
    {
        NSLog(@"could not scale image");
    }

    //pop the context to get back to the default
    UIGraphicsEndImageContext();

    return newImage;
}

@end
于 2013-02-01T17:19:50.270 に答える
3

frame.size画像のサイズがある場合は、画像ビューのをこのサイズに設定してみませんか?

編集 - -

さて、あなたのコメントを見て、私はこれを提案します:

UIImageView *imageView;
//so let's say you're image view size is set to the maximum size you want

CGFloat maxWidth = imageView.frame.size.width;
CGFloat maxHeight = imageView.frame.size.height;

CGFloat viewRatio = maxWidth / maxHeight;
CGFloat imageRatio = image.size.height / image.size.width;

if (imageRatio > viewRatio) {
    CGFloat imageViewHeight = round(maxWidth * imageRatio);
    imageView.frame = CGRectMake(0, ceil((self.bounds.size.height - imageViewHeight) / 2.f), maxWidth, imageViewHeight);
}
else if (imageRatio < viewRatio) {
    CGFloat imageViewWidth = roundf(maxHeight / imageRatio);
    imageView.frame = CGRectMake(ceil((maxWidth - imageViewWidth) / 2.f), 0, imageViewWidth, maxHeight);
} else {
    //your image view is already at the good size
}

このコードは、画像ビューのサイズを画像の比率に合わせて変更し、画像ビューを「デフォルト」の位置と同じ中心に配置します。

PS:あなたが設定imageView.layer.shouldRasterise = YES していることを願っていますimageView.layer.rasterizationScale = [UIScreen mainScreen].scale;

CALayerシャドウエフェクトを使用している場合;)UIのパフォーマンスが大幅に向上します。

于 2013-02-01T15:21:16.867 に答える
0

あなたが欲しいものは違うと思いますcontent mode。を使用してみてくださいUIViewContentModeScaleToFill。これにより、必要に応じてコンテンツのアスペクト比を変更することにより、UIImageViewのサイズに合わせてコンテンツがスケーリングされます。

公式ドキュメントのcontent modeセクションを参照して、利用可能なさまざまなコンテンツモードについて理解を深めてください(画像で示されています)。

于 2013-02-01T15:28:47.040 に答える
0
   if([[SDWebImageManager sharedManager] diskImageExistsForURL:[NSURL URLWithString:@"URL STRING1"]])
   {
       NSString *key = [[SDWebImageManager sharedManager] cacheKeyForURL:[NSURL URLWithString:@"URL STRING1"]];

       UIImage *tempImage=[self imageWithImage:[[SDImageCache sharedImageCache] imageFromDiskCacheForKey:key] scaledToWidth:cell.imgview.bounds.size.width];
       cell.imgview.image=tempImage;

   }
   else
   {
       [cell.imgview sd_setImageWithURL:[NSURL URLWithString:@"URL STRING1"] placeholderImage:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL)
        {
            UIImage *tempImage=[self imageWithImage:image scaledToWidth:cell.imgview.bounds.size.width];
            cell.imgview.image=tempImage;
//                [tableView beginUpdates];
//                [tableView endUpdates];

        }];
   }
于 2017-01-23T12:10:13.857 に答える