代码之家  ›  专栏  ›  技术社区  ›  KONG

将uibutton中的图像缩放为AspectFit?

  •  82
  • KONG  · 技术社区  · 15 年前

    我想添加一个图像到ui按钮,也想缩放我的图像以适应ui按钮(使图像更小)。请告诉我怎么做。

    这是我试过的,但不起作用:

    • 向按钮添加图像并使用 setContentMode :
    [self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
    [self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
    
    • 制作“拉伸图像”:
    UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];
    
    15 回复  |  直到 5 年前
        1
  •  27
  •   gcamp    9 年前

    如果您真的想缩放图像,可以这样做,但在使用之前应该调整它的大小。在运行时调整它的大小只会丢失CPU周期。

    这是我用来缩放图像的类别:

    UIIMAGE +额外的H

    @interface UIImage (Extras)
    - (UIImage *)imageByScalingProportionallyToSize:(CGSize)targetSize;
    @end;
    

    uiMex+

    @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)) {
    
            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:
    
    UIGraphicsBeginImageContextWithOptions(targetSize, NO, 0);
    
    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
    

    你可以按你想要的尺寸使用它。像:

    [self.itemImageButton setImage:[stretchImage imageByScalingProportionallyToSize:CGSizeMake(20,20)]];
    
        2
  •  196
  •   Dave    14 年前

    我也有同样的问题。只需设置ui按钮内的ImageView的ContentMode。

    [[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
    [self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];
    

    希望这有帮助。

        3
  •  89
  •   Pang firemonkey    8 年前

    这里的所有答案都不适合我,我用以下代码解决了问题:

    button.contentMode=uiviewContentModeScaletoFill;
    button.contentHorizontallignment=uicontrolContentHorizontallignmentFill;
    button.contentVerticalAlignment=uicontrol内容VerticalAlignment填充;
    < /代码> 
    
    

    您也可以在Interface Builder中执行此操作。

    您也可以在接口生成器中执行此操作。

    enter image description here

        4
  •  41
  •   Tanguy G.    7 年前

    以编程方式设置uibutton ImageView的最简单方法 方位拟合 模式:

    迅捷

    button.contentHorizontalAlignment = .fill
    button.contentVerticalAlignment = .fill
    button.imageView?.contentMode = .scaleAspectFit
    

    Objtovi-C

    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    button.imageView.contentMode = UIViewContentModeScaleAspectFit;
    

    注: 可以将.scaleAspectFit(uiviewContentModeScaleaspectFit)更改为.scaleAspectFill(uiviewContentModeScaleaspectFill)以设置 方位填充 模式

        5
  •  19
  •   ninjaneer    12 年前

    我有一个问题,图像大小不成比例,所以我修复它的方式是使用边缘插入。

    fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
    
        6
  •  13
  •   capikaw    10 年前

    现在可以通过ib的uibutton属性来实现。关键是将您的图像设置为背景,否则它将不起作用。

    你的图像作为背景,否则它将不起作用。

    enter image description here

        7
  •  13
  •   Ortwin Gentz    8 年前

    展开Dave的答案,可以在ib中设置按钮的 imageview all,而不使用任何代码,使用运行时属性:

    • 1 means uiviewContentModeScaleaspectFit ,。
    • 2 would mean uiviewContentModeScaleaSpectFill
    运行时属性:

    enter image description here

    • 1 方法 UIViewContentModeScaleAspectFit ,
    • 2 将意味着 UIViewContentModeScaleAspectFill .
        8
  •  8
  •   Tulleb    10 年前

    如果只想缩小按钮图像:

    yourButton.contentMode = UIViewContentModeScaleAspectFit;
    yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
    
        9
  •  4
  •   Rudolf Adamkovič    10 年前

    最干净的解决方案是 自动布局 .我放低了 内容压缩阻力优先 我的 UIButton 设置图像(不是 背景图像 通过 界面生成器 . 在那之后,我添加了一些约束来定义我的按钮的大小(在我的例子中相当复杂),它的工作方式很有魅力。

        10
  •  4
  •   Fahim Parkar    8 年前

    我有自己的方法。 该方法采用ui按钮,使图像的长宽合适。

    -(void)makeImageAspectFitForButton:(UIButton*)button{
        button.imageView.contentMode=UIViewContentModeScaleAspectFit;
        button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill;
        button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill;
    }
    
        11
  •  3
  •   andrew    13 年前

    确保已将“图像”属性设置为“图像”,但不设置为“背景”。

        12
  •  2
  •   Andy Poes    11 年前

    背景图像实际上可以很容易地设置为缩放纵横比填充。只需要在uibutton的子类中执行类似的操作:

    - (CGRect)backgroundRectForBounds:(CGRect)bounds
    {
        // you'll need the original size of the image, you 
        // can save it from setBackgroundImage:forControlState
        return CGRectFitToFillRect(__original_image_frame_size__, bounds);
    }
    
    // Utility function, can be saved elsewhere
    CGRect CGRectFitToFillRect( CGRect inRect, CGRect maxRect )
    {
        CGFloat origRes = inRect.size.width / inRect.size.height;
        CGFloat newRes = maxRect.size.width / maxRect.size.height;
    
        CGRect retRect = maxRect;
    
        if (newRes < origRes)
        {
            retRect.size.width = inRect.size.width * maxRect.size.height / inRect.size.height;
            retRect.origin.x = roundf((maxRect.size.width - retRect.size.width) / 2);
        }
        else
        {
            retRect.size.height = inRect.size.height * maxRect.size.width / inRect.size.width;
            retRect.origin.y = roundf((maxRect.size.height - retRect.size.height) / 2);
        }
    
        return retRect;
    }
    
        13
  •  0
  •   Mobile Developer    8 年前

    对于xamarin.ios(c):

        myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill;
        myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill;
        myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
    
        14
  •  0
  •   Hamid Reza Ansari    5 年前

    1-清除按钮默认文本(重要)

    2-设置像图像一样的对齐方式

    3-设置与图像类似的内容模式

    enter image description here

        15
  •  -1
  •   Dhruv    12 年前

    您只需要为三个事件设置uibutton imageview的内容模式。-

    [cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateNormal];
    
    [cell.button setImage:[UIImage imageWithData:data] forState:UIControlStateHighlighted];
    
    [cell.imgIcon setImage:[UIImage imageWithData:data] forState:UIControlStateSelected];
    

    我们有三个事件BCoz的代码,当突出显示或选择按钮大小是方形,图像大小是矩形时,它将在突出显示或选择时显示方形图像。

    我相信这对你有用。