UIButton не пойдет на Aspect Fit в iPhone - PullRequest
96 голосов
/ 11 августа 2010

У меня есть пара UIB-кнопок, и в IB они настроены на Aspect Fit, но по какой-то причине они всегда растягиваются.Есть ли что-то еще, что вы должны установить?Я пробовал все разные режимы просмотра, и ни один из них не работает, все они растягиваются.

Ответы [ 21 ]

221 голосов
/ 22 октября 2010

Решение состоит в том, чтобы установить contentMode для свойства imageView UIButton. UIButton должен быть создан с пользовательским типом, чтобы он работал, я считаю (в противном случае nil возвращается для этого свойства).

47 голосов
/ 08 марта 2016

Этот метод работал для меня очень хорошо .:

В Xib выберите кнопку и установите user defined runtime attributes:

  • Ключевые пути: self.imageView.contentMode
  • Тип: Number
  • Значение: 1

Click here to see more clearly the solution

Мыиспользуйте число, потому что вы не можете использовать enum там.Но UIViewContentModeScaleAspectFit равен 1.

42 голосов
/ 11 августа 2010

У меня была такая проблема раньше.Я решил это, поместив свое изображение в UIImageView, где действительно работают настройки contentMode, и поверх него поставил прозрачный пользовательский UIButton.

РЕДАКТИРОВАТЬ: Этот ответ устарел.См. @ ответ Вернера Альтевишера для правильного ответа в современных версиях iOS.

21 голосов
/ 11 февраля 2017

Если вы делаете это в Интерфейсном Разработчике, вы можете использовать инспектор атрибутов времени выполнения, чтобы установить это напрямую без какого-либо кода.

Установите для своего ключевого пути на кнопке значение «imageView.contentMode» с типом «Число» и значением «1» (или любым другим режимом, который вы хотите).

imageview.contentMode = 1

12 голосов
/ 11 сентября 2016

Используйте кнопку imageView для contentMode.Не непосредственно на самой кнопке.

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
6 голосов
/ 04 ноября 2013

У меня была эта проблема некоторое время назад.Проблема, с которой я столкнулся, заключалась в том, что я пытался применить этот эффект к фону UIButton, который ограничен и поэтому означает, что вы не можете настроить его так просто.

Хитрость заключается в том, чтобы установить его как изображение, а затем применить технику @ ayreguitarи это должно это исправить!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
6 голосов
/ 14 декабря 2010

Если вы поместите изображение в UIImageView за кнопкой, вы потеряете встроенную функциональность класса UIButton, такую ​​как adjustsImageWhenHighlighted и adjustsImageWhenDisabled, и, конечно, возможность установки разных изображений для разных состояний (без труда сделать это самостоятельно).

Если мы хотим, чтобы изображение было растянуто для всех состояний управления , одна попытка получить изображение с использованием imageWithCGImage:scale:orientation, как в следующем методе:

- (UIImage *) getScaledImage:(UIImage *)img insideButton:(UIButton *)btn {

    // Check which dimension (width or height) to pay respect to and
    // calculate the scale factor
    CGFloat imgRatio = img.size.width / img.size.height, 
            btnRatio = btn.frame.size.width / btn.frame.size.height,
            scaleFactor = (imgRatio > btnRatio 
                           ? img.size.width / btn.frame.size.width
                           : img.size.height / btn.frame.size.height;

    // Create image using scale factor
    UIImage *scaledImg = [UIImage imageWithCGImage:[img CGImage]
                                             scale:scaleFactor
                                       orientation:UIImageOrientationUp];
    return scaledImg;
}

Для реализации этого мы напишем:

UIImage *scaledImg = [self getScaledImage:myBtnImg insideButton:myBtn];
[myBtn setImage:scaledImg forState:UIControlStateNormal];

Это должно предотвратить растяжение изображения во всех состояниях управления. Это сработало для меня, но дайте мне знать, если это не так!

ПРИМЕЧАНИЕ: Здесь мы решаем проблему, связанную с UIButton, но insideButton: может также быть insideView: или любым другим, в который нужно вписать изображение.

4 голосов
/ 29 ноября 2015

Вот альтернативный ответ в быстром:

myButton.imageView?.contentMode = .ScaleAspectFit
4 голосов
/ 19 октября 2016

Объединение нескольких разных ответов в одном решении - создайте кнопку с пользовательским типом, установите свойство imageView для кнопки imageView и установите изображение для кнопки (а не фоновое изображение, которое будет масштабироваться для заполнения).

//Objective-C:
UIImage *image = [UIImage imageNamed:"myImageName.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFit;

//Swift:
let image = UIImage(named: "myImageName.png")
let button = UIButton(type: .custom)
button.imageView?.contentMode = .scaleAspectFit
button.setImage(image, for: .normal)
4 голосов
/ 19 марта 2015

Это сработало для меня

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

Спасибо @ayreguitar за его комментарий

...