it-swarm.com.ru

масштабировать изображение в UIButton для AspectFit?

Я хочу добавить изображение в UIButton, а также хочу масштабировать мое изображение, чтобы оно соответствовало UIButton (уменьшить изображение). Пожалуйста, покажи мне, как это сделать.

Это то, что я пытался, но это не работает:

  • Добавление изображения к кнопке и использование setContentMode:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
  • Делаем «растягивание изображения»:
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];
82
KONG

Если вы действительно хотите масштабировать изображение, сделайте это, но вы должны изменить его размер, прежде чем использовать его. Изменение размера во время выполнения приведет к потере циклов ЦП. 

Это категория, которую я использую для масштабирования изображения: 

UIImage + Extra.h

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

UIImage + Extra.m

@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)]];
27
gcamp

У меня такая же проблема. Просто установите ContentMode для ImageView, который находится внутри UIButton.

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

Надеюсь это поможет.

196
Dave

Ни один из ответов здесь действительно не работал для меня, я решил проблему с помощью следующего кода:

button.contentMode = UIViewContentModeScaleToFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

Вы также можете сделать это в Интерфейсном Разработчике.

 enter image description here

89
NAlexN

Самый простой способ программно установить UIButton imageView в аспектное соответствие режим:

Свифт

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

Objective-C

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

Примечание. Вы можете изменить .scaleAspectFit (UIViewContentModeScaleAspectFit) на .scaleAspectFill (UIViewContentModeScaleAspectFill), чтобы установить аспект заполнения mode

41
Tanguy G.

У меня были проблемы с пропорциональным изменением размера изображения, поэтому в способе его исправления использовались вставки Edge.

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
19
ninjaneer

Расширяя ответ Дейва, вы можете установить contentMode кнопки imageView в IB без кода, используя атрибуты времени выполнения:

 enter image description here

  • 1 означает UIViewContentModeScaleAspectFit,
  • 2 будет означать UIViewContentModeScaleAspectFill.
13
Ortwin Gentz

Теперь это можно сделать через свойства IB UIButton. Ключ должен установить ваше изображение как фон, иначе это не будет работать.

enter image description here

13
capikaw

Если вы просто хотите уменьшить изображение кнопки:

yourButton.contentMode = UIViewContentModeScaleAspectFit;
yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
8
Tulleb

Самое чистое решение - использовать Auto Layout . Я опустил Приоритет сопротивления сжатию содержимого моего UIButton и установил изображение (не Фоновое изображение ) через Интерфейсный конструктор . После этого я добавил пару ограничений, которые определяют размер моей кнопки (довольно сложный в моем случае), и это сработало как шарм.

4
Rudolf Adamkovič

У меня есть метод, который делает это для меня . Метод взять Uibutton и подогнать аспект изображения

-(void)makeImageAspectFitForButton:(UIButton*)button{
    button.imageView.contentMode=UIViewContentModeScaleAspectFit;
    button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill;
}
4
Abedalkareem Omreyh

убедитесь, что вы установили для изображения свойство Image, но не для фона

3
andrew

Фоновое изображение может быть легко настроено на масштабирование. Просто нужно сделать что-то подобное в подклассе 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;
}
2
Andy Poes

Для Xamarin.iOS (C #):

    myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill;
    myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill;
    myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
0
Maciek z Wrocławia

1 - очистить текст кнопки по умолчанию (важно)

2 - установить выравнивание как изображение 

3 - установить режим контента как изображение

 enter image description here

0
Hamid Reza Ansari