私はUIImageViewを持っています、そして、目的はそれに高さか幅のどちらかを与えることによって比例してそれを縮小することです。
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//Add image view
[self.view addSubview:imageView];
//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;
//change width of frame
CGRect frame = imageView.frame;
frame.size.width = 100;
imageView.frame = frame;
画像はサイズ変更されましたが、位置は左上にありません。 image/imageViewを拡大縮小するための最良の方法は何ですか?また、位置をどのように修正しますか?
ドキュメントを見つけたら、簡単に修正できます。
imageView.contentMode = UIViewContentModeScaleAspectFit;
私はスケールタイプについての会話を少し見たので、私はいくつかの最も人気のあるコンテンツモードのスケールタイプに関する 記事をまとめることにしました 。
関連付けられた画像はここにあります:
私はこれを試したところ、UIImageは_imageScaledToSizeをサポートしません。
私はカテゴリを使ってUIImageにメソッドを追加することになった - 私がApple Devフォーラムで見つけた提案。
プロジェクト全体の.h -
@interface UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
@end;
実装:
@implementation UIImage (Extras)
- (UIImage *)imageByScalingProportionallyToSize:(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;
else
scaleFactor = heightFactor;
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;
}
}
// this is actually the interesting part:
UIGraphicsBeginImageContext(targetSize);
CGRect thumbnailRect = CGRectZero;
thumbnailRect.Origin = thumbnailPoint;
thumbnailRect.size.width = scaledWidth;
thumbnailRect.size.height = scaledHeight;
[sourceImage drawInRect:thumbnailRect];
newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
if(newImage == nil) NSLog(@"could not scale image");
return newImage ;
}
@end;
imageView.contentMode = UIViewContentModeScaleAspectFill;
imageView.clipsToBounds = YES;
imageView
のサイズをimage
と一致させることもできます。次のコードはテストされていません。
CGSize kMaxImageViewSize = {.width = 100, .height = 100};
CGSize imageSize = image.size;
CGFloat aspectRatio = imageSize.width / imageSize.height;
CGRect frame = imageView.frame;
if (kMaxImageViewSize.width / aspectRatio <= kMaxImageViewSize.height)
{
frame.size.width = kMaxImageViewSize.width;
frame.size.height = frame.size.width / aspectRatio;
}
else
{
frame.size.height = kMaxImageViewSize.height;
frame.size.width = frame.size.height * aspectRatio;
}
imageView.frame = frame;
UIImage *image = [[UIImage alloc] initWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://farm4.static.flickr.com/3092/2915896504_a88b69c9de.jpg"]]];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
//set contentMode to scale aspect to fit
imageView.contentMode = UIViewContentModeScaleAspectFit;
//change width of frame
//CGRect frame = imageView.frame;
//frame.size.width = 100;
//imageView.frame = frame;
//original lines that deal with frame commented out, yo.
imageView.frame = CGRectMake(10, 20, 60, 60);
...
//Add image view
[myView addSubview:imageView];
IOS 4.2では、一番上に掲載されている元のコードが私にはうまく機能しました。
私は、CGRectを作成し、すべてのtop、left、width、およびheightの値を指定することが、テーブルセル内でUIImageViewを使用している私の場合の位置を調整するための最も簡単な方法であることを発見しました。 (それでもオブジェクトを解放するコードを追加する必要があります)
この方法でUIImageのサイズを変更できます
image = [UIImage imageWithCGImage:[image CGImage] scale:2.0 orientation:UIImageOrientationUp];
モードをAspect Fill
に選択してClip Subviews
ボックスをチェックしてImageViewを設定します。
これは私にとってはうまくいきますSwift 2.x:
imageView.contentMode = .ScaleAspectFill
imageView.clipsToBounds = true;
Swiftの場合:
self.imageViews.contentMode = UIViewContentMode.ScaleToFill
UIImageView + Scale.h:
#import <Foundation/Foundation.h>
@interface UIImageView (Scale)
-(void) scaleAspectFit:(CGFloat) scaleFactor;
@end
UIImageView + Scale.m:
#import "UIImageView+Scale.h"
@implementation UIImageView (Scale)
-(void) scaleAspectFit:(CGFloat) scaleFactor{
self.contentScaleFactor = scaleFactor;
self.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
CGRect newRect = self.frame;
newRect.Origin.x = 0;
newRect.Origin.y = 0;
self.frame = newRect;
}
@end
ここで提案されている解決策がうまくいかず、あなたの画像アセットが実際にはPDFである場合、XCodeは実際にはPDFを画像ファイルとは異なる方法で扱うことに注意してください。特に、それはPDFで適切に塗りつぶすために拡大縮小することができないようです:それは代わりにタイル張りになってしまいます。問題がPDF形式であることが判明するまで、私は頭がおかしくなりました。 JPGに変換し、あなたが行ってもいいはずです。
ImageCoverViewはUIViewで、UIImageViewを保持しています。
if (image.size.height<self.imageCoverView.bounds.size.height && image.size.width<self.imageCoverView.bounds.size.width)
{
[self.profileImageView sizeToFit];
self.profileImageView.contentMode =UIViewContentModeCenter
}
else
{
self.profileImageView.contentMode =UIViewContentModeScaleAspectFit;
}
通常、私は自分のアプリにこのメソッドを使います(Swift 2.x互換)。
// Resize UIImage
func resizeImage(image:UIImage, scaleX:CGFloat,scaleY:CGFloat) ->UIImage {
let size = CGSizeApplyAffineTransform(image.size, CGAffineTransformMakeScale(scaleX, scaleY))
let hasAlpha = true
let scale: CGFloat = 0.0 // Automatically use scale factor of main screen
UIGraphicsBeginImageContextWithOptions(size, !hasAlpha, scale)
image.drawInRect(CGRect(Origin: CGPointZero, size: size))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
私はあなたが好きなことができると思います
image.center = [[imageView window] center];