我有几个UIButtons,在IB中它们被设置为Aspect Fit,但由于某种原因它们总是被拉伸。是否还需要设置其他内容?我尝试了所有不同的视图模式,但它们都会被拉伸。
我有几个UIButtons,在IB中它们被设置为Aspect Fit,但由于某种原因它们总是被拉伸。是否还需要设置其他内容?我尝试了所有不同的视图模式,但它们都会被拉伸。
解决方案是在UIButton
的imageView
属性上设置contentMode
。我相信必须使用自定义类型创建UIButton
才能使此方法有效(否则该属性将返回nil
)。
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
- ayreguitarbutton.imageView!.contentMode = UIViewContentMode.scaleAspectFit
的意思是将按钮中图像的内容模式设置为“缩放适应”模式。 - Nestor这种方法对我非常有效:
在 Xib 中选择按钮并设置用户定义的运行时属性
:
self.imageView.contentMode
数字
1
我们使用数字是因为您无法在那里使用枚举。 但是 UIViewContentModeScaleAspectFit 等于 1。
extension UIButton {
@IBInspectable var imageContentMode: Int {
get {return imageView?.contentMode.rawValue ?? 0}
set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit}
}
}
- Yonatself
,imageView.contentMode
对我起作用了! - byJeevan我以前也遇到过这个问题。我把我的图片放在UIImageView
里,那里的contentMode
设置实际上是有效的,并在其上方放置了一个透明的自定义UIButton
。
编辑:这个答案已经过时。在现代版本的iOS中,参见@Werner Altewischer的答案获得正确答案。
使用按钮的imageView来设置contentMode,而不是直接在按钮上设置。
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
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:
或任何想要将图像适配进去的控件。
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
将不同答案组合成一个解决方案:创建一个自定义类型的按钮,设置按钮的imageView contentMode属性,并为按钮设置图像(而不是背景图像,它仍将缩放以填充)。
//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)
以下是Swift的另一种解决方案:
myButton.imageView?.contentMode = .ScaleAspectFit