Я хочу добавить изображение в UIButton, а также хочу масштабировать свое изображение, чтобы оно соответствовало UIButton (уменьшить изображение). Пожалуйста, покажите мне, как это сделать.
Это то, что я пробовал, но это не работает:
- Добавление изображения на кнопку и использование
setContentMode
:
[self.itemImageButton setImage:stretchImage forState:UIControlStateNormal];
[self.itemImageButton setContentMode:UIViewContentModeScaleAspectFit];
- Делаем «растягивающее изображение»:
UIImage *stretchImage = [updatedItem.thumbnail stretchableImageWithLeftCapWidth:0 topCapHeight:0];
Ответы:
Если вы действительно хотите масштабировать изображение, сделайте это, но вам следует изменить его размер перед использованием. Изменение его размера во время выполнения приведет к потере циклов процессора.
Это категория, которую я использую для масштабирования изображения:
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)]];
источник
UIGraphicsBeginImageContext
вместоUIGraphicsBeginImageContextWithOptions
. Просто исправил.У меня такая же проблема. Просто установите ContentMode для ImageView, который находится внутри UIButton.
[[self.itemImageButton imageView] setContentMode: UIViewContentModeScaleAspectFit]; [self.itemImageButton setImage:[UIImage imageNamed:stretchImage] forState:UIControlStateNormal];
Надеюсь это поможет.
источник
imageView.contentMode
Number
1
Ни один из ответов здесь не помог мне, я решил проблему с помощью следующего кода:
button.contentMode = UIViewContentModeScaleToFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Вы также можете сделать это в Интерфейсном Разработчике.
источник
Aspect fit
вместоscale to fill
.Самый простой способ программно установить UIButton imageView в режиме соотношения сторон :
Swift
Цель-C
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Примечание: вы можете изменить .scaleAspectFit (UIViewContentModeScaleAspectFit) на .scaleAspectFill (UIViewContentModeScaleAspectFill), чтобы установить режим заполнения аспекта
источник
У меня были проблемы с тем, что изображение не менялось пропорционально, поэтому я исправил его с помощью вставок по краям.
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
источник
Теперь это можно сделать с помощью свойств UIButton IB. Ключ в том, чтобы установить ваше изображение в качестве фона, иначе это не сработает.
источник
Расширяя ответ Дейва, вы можете установить все
contentMode
кнопкиimageView
в IB, без какого-либо кода, используя атрибуты времени выполнения:1
означаетUIViewContentModeScaleAspectFit
,2
будет значитьUIViewContentModeScaleAspectFill
.источник
Если вы просто хотите уменьшить изображение кнопки:
yourButton.contentMode = UIViewContentModeScaleAspectFit; yourButton.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10);
источник
1 - очистить текст кнопки по умолчанию (важно)
2 - установить выравнивание как изображение
3 - установить режим содержимого как изображение
источник
У меня есть метод, который сделает это за меня. Метод принимает
UIButton
и подгоняет формат изображения.-(void)makeImageAspectFitForButton:(UIButton*)button{ button.imageView.contentMode=UIViewContentModeScaleAspectFit; button.contentHorizontalAlignment=UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment=UIControlContentVerticalAlignmentFill; }
источник
Лучшее решение - использовать Auto Layout . Опустив Content Приоритет сжатия сопротивления из моих
UIButton
и установить изображение (не Фоновое изображение ) с помощью Interface Builder . После этого я добавил пару ограничений, которые определяют размер моей кнопки (довольно сложно в моем случае), и это сработало как шарм.источник
Background Image
убедитесь, что вы установили для изображения свойство Image, но не значение Background
источник
Фоновое изображение можно довольно легко настроить для масштабирования заливки сторон. Просто нужно сделать что-то вроде этого в подклассе 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; }
источник
Swift 5.0
источник
Для Xamarin.iOS (C #):
myButton.VerticalAlignment = UIControlContentVerticalAlignment.Fill; myButton.HorizontalAlignment = UIControlContentHorizontalAlignment.Fill; myButton.ImageView.ContentMode = UIViewContentMode.ScaleAspectFit;
источник
Вам просто нужно установить режим содержимого 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 при выделении или выборе, если размер кнопки - КВАДРАТ, а размер изображения - прямоугольник, тогда оно будет показывать квадратное изображение во время выделения или выбора.
Я уверен, что это сработает для вас.
источник