我有几个UIButton,在IB中将它们设置为Aspect Fit,但是由于某些原因,它们总是在拉伸。您还需要设置其他内容吗?我尝试了所有不同的视图模式,但它们都不起作用,它们都可以拉伸。
我有几个UIButton,在IB中将它们设置为Aspect Fit,但是由于某些原因,它们总是在拉伸。您还需要设置其他内容吗?我尝试了所有不同的视图模式,但它们都不起作用,它们都可以拉伸。
Answers:
我以前有过这个问题。我通过把我的形象在解决了这个问题UIImageView
,在这里contentMode
设置的实际工作,并把一个透明的定制UIButton
过的那顶。
编辑:这个答案已经过时了。有关现代版本iOS的正确答案,请参见@Werner Altewischer的答案。
解决方案是contentMode
在的imageView
属性上设置UIButton
。在UIButton
必须与自定义类型(否则就创建了这个工作,我相信nil
返回该属性)。
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
button.imageView!.contentMode = UIViewContentMode.scaleAspectFit
这种方法对我非常有效。
在Xib中,选择按钮并设置user defined runtime attributes
:
self.imageView.contentMode
Number
1
我们使用数字,因为您不能在那里使用枚举。但是UIViewContentModeScaleAspectFit等于1。
extension UIButton { @IBInspectable var imageContentMode: Int { get {return imageView?.contentMode.rawValue ?? 0} set {imageView?.contentMode = UIViewContentMode(rawValue: newValue) ?? .scaleAspectFit} } }
imageView.contentMode
为我工作!
将按钮的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,这是有限的,因此意味着您无法轻松地对其进行调整。
诀窍是将其设置为仅图像,然后应用@ayreguitar的技术,这应该可以解决它!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
这对我有用
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
感谢@ayreguitar的评论
将几个不同的答案组合到一个解决方案中-创建具有自定义类型的按钮,设置按钮的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)
该答案基于@WernerAltewischer的答案。
为了避免将我的按钮连接到IBOutlet来执行代码,我将UIButton的类子类化:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
现在,在xib中创建一个自定义按钮,并设置其图像(而不是背景图像):
然后,设置其类:
你完成了!
而不是
你的按钮的图像纵横适合现在的预期:
ios12。您还需要添加内容“对齐”
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()
}
}
我遇到了同样的问题,但无法正常工作(也许这是SDK的错误)。
最终,作为一种解决方法,我UIImageView
在按钮后面放置了一个按钮,并设置了所需的选项,然后UIButton
在其顶部放置了一个空白。