Я создал экземпляр 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);
Я столкнулся с аналогичной проблемой, когда у меня было фоновое изображение (одно с рамкой) и изображение (флаг) для настраиваемой кнопки. Я хотел, чтобы флаг был уменьшен и по центру. Я попытался изменить атрибут imageView, но не смог и увидел это изображение -
В ходе экспериментов я пробовал:
button.imageEdgeInsets = UIEdgeInsetsMake(kTop,kLeft,kBottom,kRight)
Я добился ожидаемого результата:
источник
Дополнительный способ конфигурации в файле XIB. Вы можете выбрать этот вариант, если хотите, чтобы текст или изображение были масштабированы до полной заливки в UIButton. То же самое и с кодом.
UIButton *btn = [UIButton new]; btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
источник
использовать
button.contentMode = UIViewContentModeScaleToFill;
не
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Обновить:
Как прокомментировал @Chris,
источник
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];
источник
Я нашел это решение.
1) Подклассифицируйте следующие методы
UIButton
+ (id)buttonWithType:(UIButtonType)buttonType { MyButton *toReturn = [super buttonWithType:buttonType]; toReturn.imageView.contentMode = UIViewContentModeScaleAspectFit; return toReturn; } - (CGRect)imageRectForContentRect:(CGRect)contentRect { return contentRect; }
И это хорошо работает.
источник
Странно, единственная комбинация, которая у меня сработала (iOS 5.1), это ...
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
и
[button setImage:newImage forState:UIControlStateNormal];
источник
Просто сделайте (из дизайна ИЛИ из кода):
От дизайна
[Для точки №3: измените выравнивание по горизонтали и вертикали на
UIControlContentHorizontalAlignmentFill and UIControlContentVericalAlignmentFill]
Из кода
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
источник
Я только что столкнулся с той же проблемой, и на этот вопрос есть возможный ответ:
Почему размер пользовательского изображения UIButton не изменяется в Интерфейсном Разработчике?
По сути, вместо этого используйте свойство backgroundimage, которое масштабируется.
источник
как это может решить вашу проблему:
+ (UIImage*)resizedImage:(UIImage*)image { CGRect frame = CGRectMake(0, 0, 60, 60); UIGraphicsBeginImageContext(frame.size); [image drawInRect:frame]; UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return resizedImage; }
источник
Из небольшого теста, который я только что сделал после прочтения здесь, зависит от того, используете ли вы 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];
источник
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
источник
Это также будет работать, поскольку backgroundImage автоматически масштабируется
[button setBackgroundImage:image forState:UIControlStateNormal];
источник
Раскадровка
Вы должны определить конкретное свойство в Runtime Attributes of Identity Inspector -
imageView.contentModel
, где вы устанавливаете значение относительноrawValue
позиции перечисленияUIViewContentMode
. 1 означает scaleAspectFit .И выравнивание кнопки в инспекторе атрибутов :
источник
Я не могу использовать решение с помощью _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; }
источник
Надеюсь, это поможет кому-то другому:
Swift 3+
button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.fill button.contentVerticalAlignment = UIControlContentVerticalAlignment.fill
источник
Вы можете изменить imageView, используя собственный класс UIButton. Пожалуйста, посмотрите мой ответ. https://stackoverflow.com/a/59874762/5693826
источник
из @JosephH
contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.fill contentVerticalAlignment = UIControl.ContentVerticalAlignment.fill
источник
У каждого UIButton есть собственный скрытый UIImageView. Итак, мы должны установить режим содержимого, как показано ниже ...
[[btn imageView] setContentMode: UIViewContentModeScaleAspectFit]; [btn setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
источник
В левом нижнем углу скриншота вы можете увидеть свойства растяжения. Попробуйте использовать те.
источник