82

を使用して、画像を含む「ボタン」という名前の UIButton インスタンスを作成しました[UIButton setImage:forState:]。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);
4

20 に答える 20

94

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

commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;

これにより、ボタンを水平方向にスケーリングできます。縦置きもあります。

それを理解するのに数時間かかりました(プロパティの命名は非常に直感的ではありません)ので、共有したいと思いました。

于 2011-11-18T08:56:24.387 に答える
48

XIB ファイルの構成の追加方法。UIButton でテキストまたは画像を完全に塗りつぶしたい場合は、このオプションを選択できます。コードと同じになります。

UIButton *btn = [UIButton new];

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

ここに画像の説明を入力

于 2015-12-16T04:27:57.253 に答える
24

使用する

button.contentMode = UIViewContentModeScaleToFill;

いいえ

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

アップデート:

@クリスがコメントしたように、

これを setImage:forState: で機能させるには、次のようにして水平方向にスケーリングする必要があります。

于 2010-04-10T15:09:05.857 に答える
15
    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]; 
于 2009-12-24T08:23:09.903 に答える
10

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

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

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

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

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

于 2010-06-21T17:40:02.070 に答える
9

奇妙なことに、私(iOS 5.1)で機能した唯一のコンボは...

button.imageView.contentMode = UIViewContentModeScaleAspectFit;

[button setImage:newImage forState:UIControlStateNormal];

于 2012-04-02T17:43:20.837 に答える
8

私はちょうどこれと同じ問題に遭遇しました、そしてこの質問に可能な答えがあります:

カスタムUIButtonイメージがInterfaceBuilderでサイズ変更されないのはなぜですか?

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

于 2010-09-14T05:56:27.530 に答える
8

するだけです(デザインまたはコードから):

設計から

  1. xib OR ストーリーボードを開きます。
  2. 選択ボタン
  3. 属性インスペクターの内側(右側) > [コントロール]セクションで、水平方向と垂直方向の両方で最後の4 番目のオプションを選択します。

[ポイント 3 の場合: Horizo​​ntal と Vertical Align を次のように変更します。UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]

コードから

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;
于 2015-09-11T08:24:42.837 に答える
5

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

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

 return resizedImage;
}
于 2010-03-17T03:26:23.577 に答える
4
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment =  UIControlContentVerticalAlignmentFill;
于 2012-11-01T13:01:00.893 に答える
2

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

[button setBackgroundImage:image forState:UIControlStateNormal];

于 2016-03-16T22:17:48.087 に答える
1

_imageView で使用するソリューションを取得できませんが、a を使用し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;
}
于 2009-12-25T03:16:37.637 に答える
0

UIButton のカスタム クラスを使用して、imageView を変更できます。私の答えを見てください。 https://stackoverflow.com/a/59874762/5693826

于 2020-01-23T09:07:31.643 に答える