it-swarm.com.ru

Как предотвратить растягивание фонового изображения кнопки?

Я выделяю UIButtonTypeCustom UIButton для UIView с фоновым изображением, которое меньше, чем рамка кнопки. Причина, по которой изображение меньше, заключается в том, что я пытаюсь добавить больше «целевой области» для кнопки UIB. Однако изображение масштабируется до полного размера кадра, а не только до размера изображения.

Я попытался установить для свойства UIButton и UIButton imageView contentMode значение UIViewContentModeScaleAspectFit, но не повезло, изображение все еще растягивается.

Есть ли способ сделать то, что я пытаюсь сделать программно?

Заранее спасибо!

49
Raphael Caixeta

Многие люди совершают ту же ошибку, что и вы, в отношении изображений кнопок, а затем перепрыгивают через обручи, пытаясь заставить кнопку вести себя так, как они этого ожидают. Давайте разберемся с этим раз и навсегда: 

У UIButton есть два типа изображений, которые он может отображать - изображение переднего плана и фоновое изображение . Предполагается, что фоновое изображение кнопки заменит текстуру фона кнопки. Таким образом, имеет смысл, что он растягивается, чтобы заполнить весь фон. Однако изображение переднего плана кнопки, как ожидается, будет значком, который может отображаться или не отображаться рядом с текстом; это не будет растягиваться. _ может уменьшаться, если рамка меньше изображения, но не будет растягиваться. Вы даже можете установить выравнивание изображения переднего плана, используя свойства выравнивания элемента управления в Интерфейсном Разработчике.

Передний план и фоновое изображение кнопки могут быть установлены в коде так:

// stretchy
[self setBackgroundImage:backgroundImage forState:UIControlStateNormal];  

// not stretchy
[self setImage:forgroundImage forState:UIControlStateNormal]; 
124
memmons

У вас нет доступа к фону imageView, , но есть полностью рабочий обходной путь:

EDIT: Существует еще лучший обходной путь, чем тот, который я опубликовал изначально .. Вы можете создать UIImage из любого цвета, и вызвать -setBackgroundImage:forState.

См. bradley's ответ, здесь: https://stackoverflow.com/a/20303841/1147286


Оригинальный ответ:

Вместо вызова -setBackgroundImage:forState: создайте новый UIImageView и добавьте его в качестве подпредставления кнопки.

UIImageView *bgImageView = [[UIImageView alloc] initWithImage:img];
bgImageView.contentMode = UIViewContentModeScaleAspectFit;
[bgImageView setFrame:CGRectMake(0, 0, videoButton.frame.size.width, videoButton.frame.size.height)];
bgImageView.tag = 99;
[yourButton addSubview:bgImageView];
[yourButton bringSubviewToFront:yourButton.imageView];
  1. Создать изображение
  2. Установите режим содержимого и фрейм
  3. Я также установил узнаваемый тег, чтобы при повороте экрана я мог легко найти свой пользовательский imageView в подпредставлениях кнопки и сбросить ее рамку.
  4. Добавьте это как подпредставление к кнопке
  5. Перенесите фронтальный вид изображения кнопки на передний план, чтобы наш пользовательский вид изображения не перекрывал его

Когда кнопку нужно повернуть, просто найдите imageView по его тегу и сбросьте его рамку:

UIImageView *bgImageView = (UIImageView *)[button viewWithTag:99];
[bgImageView setFrame:CGRectMake(0, 0, newWidth, newHeight)];
8
Zoltán Matók

Самый чистый и простой способ это, вероятно, использовать заголовки вставок кнопки.

Вы устанавливаете свое изображение как изображение кнопки, а затем меняете левую вставку заголовка, чтобы она соответствовала минус ширине вашего изображения:

myButton.titleEdgeInsets = UIEdgeInsetsMake(0, -myImage.width, 0, 0)

Это переместит текст назад, где он был до того, как изображение было добавлено слева. Вы также можете использовать это значение, чтобы добавить немного отступа к вашей кнопке.

1
AntonyG

Наткнулся на эту проблему тоже. 

Добавление изображения программно, как подробно объясняет меммон, не помогло :( 

У меня была кнопка 100x40 и изображение 100x100, оно выглядело сжатым, а не встроенным, как можно было бы сделать из опции «Подгонка по размеру». На самом деле, ни один из этих вариантов просмотра не имел эффекта.

Мне просто пришлось изменить его масштаб, чтобы он поместился на кнопке, а затем использовать setImage:

UIImage *img=[UIImage imageNamed:@"myimage.png"];
CGImageRef imgRef = [img CGImage];
CGFloat imgW = CGImageGetWidth(imgRef);
CGFloat imgH = CGImageGetHeight(imgRef);
CGFloat btnW = myBttn.frame.size.width;
CGFloat btnH = myBttn.frame.size.height;
//get lesser button dimension
CGFloat minBtn=btnW;
if (btnW>btnH) {
    minBtn=btnH;
}
//calculate scale using greater image dimension
CGFloat scl=imgH/minBtn;
if (imgW>imgH) {
    scl=imgW/minBtn;
}
//scale image
UIImage *scaledImage = [UIImage imageWithCGImage:[img CGImage] scale:(img.scale * scl) orientation:(img.imageOrientation)];
//clean up
UIGraphicsEndImageContext();
//set it on a button
[myBttn setImage:scaledImage forState:UIControlStateNormal];
0
Boris Gafurov

может помочь кому-то

button.subviews.first?.contentMode = .scaleAspectFit
0
ARSHWIN DENUEV LAL

Еще одним соображением является ограничение BaseLine. Если для ваших кнопок установлено это ограничение (отображаемое в виде горизонтальной или вертикальной линии через несколько элементов управления на макете), это приведет к растяжению ваших изображений без растяжения основного элемента управления кнопки. Если ваша кнопка иным образом правильно ограничена (начальные/конечные и верхние/нижние пробелы и т.д.), Удаление ограничения BaseLine не должно влиять на компоновку, в то же время позволяя изображению переднего плана масштабироваться должным образом до формы основной кнопки.

0
Epsilon3

Я предполагаю, что самое простое решение - использовать метод resizableImageWithCapInsets в UIImage. Используйте UIEdgeInsetsMake для настройки свободных мест.

0
MacMark