Как масштабировать образ изображения UIButton?
Я создал экземпляр UIButton с именем "button" с изображением с помощью [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);
Ответы
Ответ 1
Для исходного плаката, вот решение, которое я нашел:
commentButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
Это позволит вашей кнопке масштабироваться горизонтально. Существует также вертикальная установка.
Принял несколько часов, чтобы понять, что один из них (наименование свойства очень неинтуитивно), поэтому я решил поделиться.
Ответ 2
Я столкнулся с аналогичной проблемой, где у меня есть фоновое изображение (одно с рамкой) и изображение (флаг) для пользовательской кнопки. Я хотел, чтобы флаг был уменьшен и в центре. Я попытался изменить атрибут imageView, но не удалось и увидел это изображение -
![enter image description here]()
Во время моих экспериментов я попытался:
button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)
Я достиг ожидаемого результата:
![enter image description here]()
Ответ 3
Дополнительный путь для конфигурации в XIB файле.
Вы можете выбрать эту опцию, если хотите, чтобы текст или изображение заполнялись по шкале UIButton.
Это будет то же самое с кодом.
UIButton *btn = [UIButton new];
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
![введите описание изображения здесь]()
Ответ 4
использовать
button.contentMode = UIViewContentModeScaleToFill;
не
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Update:
Как заметил @Chris,
Чтобы заставить это работать для setImage: forState:, вам нужно сделать следующее по горизонтали: myButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
Ответ 5
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];
Ответ 6
Я нашел это решение.
1) Подкласс следующие методы UIButton
+ (id)buttonWithType:(UIButtonType)buttonType {
MyButton *toReturn = [super buttonWithType:buttonType];
toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit;
return toReturn;
}
- (CGRect)imageRectForContentRect:(CGRect)contentRect {
return contentRect;
}
И он работает хорошо.
Ответ 7
Странно, единственная комбо, которая работала для меня (iOS 5.1), была...
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
и
[button setImage:newImage forState:UIControlStateNormal];
Ответ 8
Я просто столкнулся с этой проблемой, и в этом вопросе есть возможный ответ:
Почему пользовательский образ UIButton не изменяет размер в Interface Builder?
По существу, вместо этого используйте свойство backgroundimage, которое становится масштабированным.
Ответ 9
Просто сделайте (из дизайна OR From Code):
От дизайна
- Откройте xib OR Storyboard.
- Кнопка выбора
- Внутри Инспектор атрибутов (справа) > В разделе "Управление" выберите последний 4-й вариант для горизонтального и вертикального. li >
[Для пункта № 3: изменить горизонтальное и вертикальное выравнивание на UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]
Из кода
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Ответ 10
как это может решить вашу проблему:
+ (UIImage*)resizedImage:(UIImage*)image
{
CGRect frame = CGRectMake(0, 0, 60, 60);
UIGraphicsBeginImageContext(frame.size);
[image drawInRect:frame];
UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return resizedImage;
}
Ответ 11
Из небольшого теста, который я только что прочитал здесь, зависит, если вы используете 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];
Ответ 12
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Ответ 13
Я не могу использовать решение _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;
}
Ответ 14
Это также будет работать, так как backgroundImage автоматически масштабирует
[button setBackgroundImage:image forState:UIControlStateNormal];
Ответ 15
Раскадровка
Вы должны определить конкретное свойство в Атрибутах времени выполнения Инспектор удостоверений - imageView.contentModel
, где вы устанавливаете значение относительно rawValue
позиции enum UIViewContentMode
. 1 означает scaleAspectFit.
![Установить button.imageView.contentMode в раскадровке]()
И выравнивание кнопок, в Инспекторе атрибутов:
![Полное выравнивание кнопки]()
Ответ 16
![Снимок экрана в XCode 8]()
В левом нижнем углу снимка экрана вы можете увидеть свойства растягивания. Попробуйте использовать их.
Ответ 17
Я надеюсь, что это может помочь кому-то еще:
Свифт 3+
button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill
button.contentVerticalAlignment = UIControlContentVerticalAlignment.fill
Ответ 18
У каждого UIButton есть один скрытый UIImageView. Поэтому мы должны установить режим содержимого, как показано ниже...
[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit];
[btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];