web-dev-qa-db-ja.com

UIButton imageViewをスケーリングするにはどうすればよいですか?

[UIButton setImage:forState:]を使用して、画像を含む「ボタン」という名前のUIButtonインスタンスを作成しました。 button.frameは、画像のサイズよりも大きくなっています。

次に、このボタンの画像を小さくスケーリングします。 button.imageView.framebutton.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);
78
vcLwei

元のポスターについて、私が見つけた解決策は次のとおりです。

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

これにより、ボタンを水平方向に拡大縮小できます。垂直設定もあります。

1つ(プロパティの名前は非常に直感的ではない)であることを理解するのに数時間かかったので、共有すると思いました。

87
Chris

私は同様の問題に直面しました。そこでは、カスタムボタンの背景画像(境界線のあるもの)と画像(フラグ)があります。フラグを縮小して中央に配置したかったのです。 imageViewの属性を変更しようとしましたが、成功せず、この画像を見ていました-

enter image description here

私の実験中に、私は試してみました:

button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)

期待通りの結果を達成しました:

enter image description here

61
Hitesh Savaliya

XIBファイルでの設定の追加方法。テキストまたは画像をUIButtonで拡大/縮小する場合は、このオプションを選択できます。コードでも同じです。

UIButton *btn = [UIButton new];

btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment   = UIControlContentVerticalAlignmentFill;

enter image description here

33
Linh Nguyen

つかいます

button.contentMode = UIViewContentModeScaleToFill;

じゃない

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

更新:

@Chrisがコメントしたように、

これをsetImage:forState:で機能させるには、次を実行して水平方向にスケーリングする必要があります。myButton.contentHorizo​​ntalAlignment = UIControlContentHorizo​​ntalAlignmentFill;

22
pavelpanov
    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]; 
15
EEE

私はこの解決策を見つけました。

1)UIButtonの以下のメソッドをサブクラス化します

+ (id)buttonWithType:(UIButtonType)buttonType {
    MyButton *toReturn = [super buttonWithType:buttonType];
    toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
    return toReturn;
}

- (CGRect)imageRectForContentRect:(CGRect)contentRect {
    return contentRect;
}

そしてそれはうまく機能します。

10
marcio

奇妙なことに、私のために働いた唯一のコンボ(iOS 5.1)は...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

そして

[button setImage:newImage forState:UIControlStateNormal];

9
Hlung

私はこの同じ問題に出くわしましたが、この質問には可能な答えがあります。

カスタムUIButton画像がInterface Builderでサイズ変更されないのはなぜですか?

基本的に、代わりにbackgroundimageプロパティを使用します。これはスケーリングされます。

7
JosephH

ただ(デザインからORコードから)):

設計から

  1. Xib OR Storyboard。
  2. 選択ボタン
  3. 内部属性インスペクター(右側)> In "コントロール"セクション>水平および垂直の両方で最後の4番目のオプションを選択します。

[ポイント#3の場合:水平および垂直の配置をUIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]に変更します

コードから

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;
6

このように問題を解決できます:

+ (UIImage*)resizedImage:(UIImage*)image
{
 CGRect frame = CGRectMake(0, 0, 60, 60);
 UIGraphicsBeginImageContext(frame.size);
 [image drawInRect:frame];
 UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();

 return resizedImage;
}
5
huangkui

ここで読んだ直後に行った小さなテストから、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];
5
user1105951
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;
4
iomar

BackgroundImageが自動的にスケーリングするため、これも機能します

[button setBackgroundImage:image forState:UIControlStateNormal];

2
Harris

_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;
}
1
vcLwei

絵コンテ

特定のプロパティをRuntime AttributesofIdentity inspector– _imageView.contentModel_、enum rawValueUIViewContentMode位置に相対的に値を設定します。 1はscaleAspectFitを意味します。

Set button.imageView.contentMode in Storyboard

ボタンの配置、属性インスペクター

Full alignment of button

1
dimpiax

Screenshot in XCode 8

スクリーンショットの左下に、ストレッチプロパティが表示されます。それらを使ってみてください。

0
Harsh G.

これが他の誰かに役立つことを願っています:

Swift 3 +

button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment =  UIControlContentVerticalAlignment.fill
0
Dasoga