UIButton не поддерживает Aspect Fill contentMode после изменения размера анимации
Я использую автоматический макет. Ниже приведено исходное состояние представления.
В центре находится кнопка, содержащаяся в представлении. На кнопке есть вкладка ContentMode Aspect Fill, и изображение устанавливается в качестве фонового изображения кнопки.
![enter image description here]()
Затем я использую следующий код для преобразования вида, который увеличит центральную карту, чтобы заполнить экран, и переместите изображение в верхнюю часть представления:
cardTrailingSpaceConstraint.constant = 0
cardLeadingSpaceConstraint.constant = 0
cardView.removeConstraint(cardAspectRatioConstraint)
let cardHeightConstraint = NSLayoutConstraint(item: cardView, attribute: .Height, relatedBy: .Equal, toItem: view, attribute: .Height, multiplier: 1.0, constant: 0)
view.addConstraint(cardHeightConstraint)
dishImageButton.removeConstraint(dishButtonBottomSpaceConstraint)
let dishButtonHeightConstraint = NSLayoutConstraint(item: dishImageButton, attribute: .Height, relatedBy: .Equal, toItem: cardView, attribute: .Height, multiplier: 0.2, constant: 0)
cardView.addConstraint(dishButtonHeightConstraint)
cardView.setNeedsUpdateConstraints()
UIView.animateWithDuration(0.7, delay: 0, usingSpringWithDamping: 0.7, initialSpringVelocity: 0.7, options: nil, animations: { [unowned self] () -> Void in
self.cardHeader.alpha = 0
self.cardView.layer.cornerRadius = 0
self.cardView.layoutIfNeeded()
}) { [unowned self] (finished) -> Void in
}
Результат:
![enter image description here]()
Однако это не то, что я хочу. Кнопка не соблюдает contentMode, а затем изображение растягивается.
Может ли кто-нибудь сказать мне, как поддерживать Aspect Fill contentMode кнопки?
Ответы
Ответ 1
- Установите тип кнопки
UIButtonTypeCustom
( "Пользовательский" в раскадровке или xib).
- Установите изображение кнопки, а не фоновое изображение кнопки.
- В
viewDidLoad
установите button.imageView.contentMode
в UIViewContentMode.ScaleAspectFill
.
Ответ 2
Swift 3
Отключение ответа Роба:
let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 80, height: 30))
btn.setImage(UIImage(named: "albumsBtn"), for: UIControlState.normal)
btn.imageView?.contentMode = UIViewContentMode.scaleAspectFit
btn.addTarget(self.navigationController, action: #selector(CustomGalleryViewController.showAlbums(_:)), for: UIControlEvents.touchUpInside)
let item = UIBarButtonItem(customView: btn)
self.navigationItem.leftBarButtonItem = item
Ответ 3
Swift 2
button.imageView?.contentMode = UIViewContentMode.ScaleAspectFit
все contentMode:
.ScaleToFill
.ScaleAspectFit
.ScaleAspectFill
.Redraw
.Center
.Top
.Bottom
.Left
.Right
.TopLeft
.TopRight
.BottomLeft
.BottomRight
Ответ 4
Попробуйте это перед использованием [btn setImage: forState:]:
btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
btn.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
//Center
btn.contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.center
//Left
btn.contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.left
//Right
btn.contentHorizontalAlignment = UIControl.ContentHorizontalAlignment.right
Ответ 5
версия Swift 2.x:
let myButton = UIButton(type: .Custom)
myButton.frame = CGRectMake(0, 0, 200, 20)
myButton.backgroundColor = UIColor.blackColor()
myButton.imageView.contentMode = .ScaleAspectFill // ALTERNATIVE: .ScaleAspectFit
myButton.setImage(UIImage(named: "myImageName"), forState: .Normal)
myButton.addTarget(self, action: #selector(buttonAction), forControlEvents: .TouchUpInside)
view.addSubview(myButton)
Ответ 6
Swift 4.2
расширение
![]()
// Inspectable image content mode
extension UIButton {
/// 0 => .ScaleToFill
/// 1 => .ScaleAspectFit
/// 2 => .ScaleAspectFill
@IBInspectable
var imageContentMode: Int {
get {
return self.imageView?.contentMode.rawValue ?? 0
}
set {
if let mode = UIViewContentMode(rawValue: newValue),
self.imageView != nil {
self.imageView?.contentMode = mode
}
}
}
}
UPDATE: Этот и другие ответы не работают для меня в ios 11. Самый близкий ответ - @Jaro, но я думаю, что лучше сделать UIImageView, а над ним добавить кнопку или создать пользовательский класс UIImageView, который будет иметь распознаватель жестов и анимация кликов.
Ответ 7
В Xcode 10.1 вы можете использовать интерфейсный конструктор. В инспекторе атрибутов справа используйте раздел "Управление" следующим образом:
![ios swift xcode 10.1 uibutton scale to fill]()
Ответ 8
Язык, кажется, был обновлен.
Мне пришлось копнуть немного глубже, чтобы получить решение xscoder для:
myButton.imageView.contentMode = .ScaleAspectFill
обновленная версия выглядит следующим образом:
myButton.imageView?.contentMode = UIView.ContentMode.scaleAspectFit
Ответ 9
Вы можете подклассифицировать кнопку и добавить их:
class FitButton: UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override func layoutSubviews() {
self.imageView?.contentMode = .scaleAspectFill
self.contentHorizontalAlignment = .fill
self.contentVerticalAlignment = .fill
super.layoutSubviews()
}
}
Ответ 10
может помочь кому-то
button.subviews.first?.contentMode = .scaleAspectFit
Ответ 11
стриж
для кнопки имеет ContentMode Aspect Fill:
btn.contentHorizontalAlignment = .fill
btn.contentVerticalAlignment = .fill
btn.imageView?.contentMode = .scaleAspectFill