[UIButton setImage:forState:]
を使用して、画像を含む「ボタン」という名前のUIButtonインスタンスを作成しました。 button.frameは、画像のサイズよりも大きくなっています。
次に、このボタンの画像を小さくスケーリングします。 button.imageView.frame
、button.imageView.bounds
、およびbutton.imageView.contentMode
を変更しようとしましたが、すべて効果がないようです。
UIButton
のimageViewの拡大縮小を手伝ってくれる人はいますか?
次のようにUIButton
を作成しました。
UIButton *button = [[UIButton alloc] init];
[button setImage:image forState:UIControlStateNormal];
私はこのように画像をスケーリングしようとしました:
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.bounds = CGRectMake(0, 0, 70, 70);
この:
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
button.imageView.frame = CGRectMake(0, 0, 70, 70);
元のポスターについて、私が見つけた解決策は次のとおりです。
commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
これにより、ボタンを水平方向に拡大縮小できます。垂直設定もあります。
1つ(プロパティの名前は非常に直感的ではない)であることを理解するのに数時間かかったので、共有すると思いました。
私は同様の問題に直面しました。そこでは、カスタムボタンの背景画像(境界線のあるもの)と画像(フラグ)があります。フラグを縮小して中央に配置したかったのです。 imageViewの属性を変更しようとしましたが、成功せず、この画像を見ていました-
私の実験中に、私は試してみました:
button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)
期待通りの結果を達成しました:
つかいます
button.contentMode = UIViewContentModeScaleToFill;
じゃない
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
更新:
@Chrisがコメントしたように、
これをsetImage:forState:で機能させるには、次を実行して水平方向にスケーリングする必要があります。myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
UIButton *button= [[UIButton alloc] initWithFrame:CGRectMake(0,0,70,70)];
button.buttonType = UIButtonTypeCustom;
UIImage *buttonImage = [UIImage imageNamed:@"image.png"];
UIImage *stretchableButtonImage = [buttonImage stretchableImageWithLeftCapWidth:12 topCapHeight:0];
[button setBackgroundImage:stretchableButtonImage forState:UIControlStateNormal];
私はこの解決策を見つけました。
1)UIButton
の以下のメソッドをサブクラス化します
+ (id)buttonWithType:(UIButtonType)buttonType {
MyButton *toReturn = [super buttonWithType:buttonType];
toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
return toReturn;
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
return contentRect;
}
そしてそれはうまく機能します。
奇妙なことに、私のために働いた唯一のコンボ(iOS 5.1)は...
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
そして
[button setImage:newImage forState:UIControlStateNormal];
私はこの同じ問題に出くわしましたが、この質問には可能な答えがあります。
カスタムUIButton画像がInterface Builderでサイズ変更されないのはなぜですか?
基本的に、代わりにbackgroundimageプロパティを使用します。これはスケーリングされます。
ただ(デザインからORコードから)):
[ポイント#3の場合:水平および垂直の配置をUIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]
に変更します
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
このように問題を解決できます:
+ (UIImage*)resizedImage:(UIImage*)image
{
CGRect frame = CGRectMake(0, 0, 60, 60);
UIGraphicsBeginImageContext(frame.size);
[image drawInRect:frame];
UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
ここで読んだ直後に行った小さなテストから、setImageまたはsetBackgroundImageを使用するかどうかによって異なりますが、どちらも同じ結果を出し、画像を伸ばします
//for setBackgroundImage
self.imageButton.contentMode = UIViewContentModeScaleAspectFill;
[self.imageButton setBackgroundImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];
//for setImage
self.imageButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.imageButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[self.imageButton setImage:[UIImage imageNamed:@"imgFileName"] forState:UIControlStateNormal];
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
BackgroundImageが自動的にスケーリングするため、これも機能します
[button setBackgroundImage:image forState:UIControlStateNormal];
_imageViewで使用するソリューションを取得することはできませんが、CGContextRef
を使用して解決できます。 UIGraphicsGetCurrentContext
を使用してcurrentContextRefを取得し、currentContextRefに画像を描画してから、画像を拡大縮小または回転して、新しい画像を作成します。しかし、それは完璧ではありません。
コード:
-(UIImage*) scaleAndRotateImage:(UIImage*)photoimage width:(CGFloat)bounds_width height:(CGFloat)bounds_height;
{
CGImageRef imgRef = photoimage.CGImage;
CGFloat width = CGImageGetWidth(imgRef);
CGFloat height = CGImageGetHeight(imgRef);
CGAffineTransform transform = CGAffineTransformIdentity;
CGRect bounds = CGRectMake(0, 0, width, height);
bounds.size.width = bounds_width;
bounds.size.height = bounds_height;
CGFloat scaleRatio = bounds.size.width / width;
CGFloat scaleRatioheight = bounds.size.height / height;
CGSize imageSize = CGSizeMake(CGImageGetWidth(imgRef), CGImageGetHeight(imgRef));
CGFloat boundHeight;
UIImageOrientation orient = photoimage.imageOrientation;
switch(orient)
{
case UIImageOrientationUp: //EXIF = 1
transform = CGAffineTransformIdentity;
break;
case UIImageOrientationUpMirrored: //EXIF = 2
transform = CGAffineTransformMakeTranslation(imageSize.width, 0.0);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
break;
case UIImageOrientationDown: //EXIF = 3
transform = CGAffineTransformMakeTranslation(imageSize.width, imageSize.height);
transform = CGAffineTransformRotate(transform, M_PI);
break;
case UIImageOrientationDownMirrored: //EXIF = 4
transform = CGAffineTransformMakeTranslation(0.0, imageSize.height);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
break;
case UIImageOrientationLeftMirrored: //EXIF = 5
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, imageSize.width);
transform = CGAffineTransformScale(transform, -1.0, 1.0);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationLeft: //EXIF = 6
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(0.0, imageSize.width);
transform = CGAffineTransformRotate(transform, 3.0 * M_PI / 2.0);
break;
case UIImageOrientationRightMirrored: //EXIF = 7
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeScale(-1.0, 1.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
case UIImageOrientationRight: //EXIF = 8
boundHeight = bounds.size.height;
bounds.size.height = bounds.size.width;
bounds.size.width = boundHeight;
transform = CGAffineTransformMakeTranslation(imageSize.height, 0.0);
transform = CGAffineTransformRotate(transform, M_PI / 2.0);
break;
default:
[NSException raise:NSInternalInconsistencyException format:@"Invalid?image?orientation"];
break;
}
UIGraphicsBeginImageContext(bounds.size);
CGContextRef context = UIGraphicsGetCurrentContext();
if (orient == UIImageOrientationRight || orient == UIImageOrientationLeft)
{
CGContextScaleCTM(context, -scaleRatio, scaleRatioheight);
CGContextTranslateCTM(context, -height, 0);
}
else
{
CGContextScaleCTM(context, scaleRatio, -scaleRatioheight);
CGContextTranslateCTM(context, 0, -height);
}
CGContextConcatCTM(context, transform);
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, width, height), imgRef);
UIImage *imageCopy = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return imageCopy;
}
これが他の誰かに役立つことを願っています:
Swift 3 +
button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment = UIControlContentVerticalAlignment.fill