我有几个 UIButton,在 IB 中它们设置为 Aspect Fit,但由于某种原因,它们总是在拉伸。你还有什么需要设置的吗?我尝试了所有不同的视图模式,但它们都不起作用,它们都在拉伸。
21 回答
解决方法是设置 的contentMode
onimageView
属性UIButton
。我相信必须使用UIButton
自定义类型创建它才能工作(否则nil
返回此属性)。
这种方法对我很有效。:
在Xib中选择按钮并设置user defined runtime attributes
:
- 关键路径:
self.imageView.contentMode
- 类型:
Number
- 价值:
1
我们使用数字是因为你不能在那里使用枚举。但是 UIViewContentModeScaleAspectFit 等于 1。
我以前也遇到过这个问题。我解决了这个问题,把我的图像放在一个设置实际起作用的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
and 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 的评论
这是swift的替代答案:
myButton.imageView?.contentMode = .ScaleAspectFit
将几个不同的答案组合成一个解决方案——创建一个具有自定义类型的按钮,设置按钮的 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)
ios 12. 您还需要添加内容对齐
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()
}
}
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
此答案基于@WernerAltewischer 的答案。
为了避免将我的按钮连接到 IBOutlet 以在其上执行代码,我对 UIButton 的类进行了子类化:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
现在在您的 xib 中创建一个自定义按钮,并设置其图像(不是背景图像):
然后,设置它的类:
你完成了!
现在正如预期的那样
,而不是按钮的图像方面适合:
UIView 内容模式适用于对应的 CALayer 的“内容”。这适用于UIImageView
s 因为他们将CALayer
内容设置为相应的CGImage
.
drawRect:
最终渲染到图层内容。
自定义UIButton
(据我所知)没有内容(圆角矩形样式按钮可能使用内容呈现)。该按钮具有子视图:背景UIImageView
、图像UIImageView
和标题UILabel
。在子视图上设置contentMode
可能会做你想做的事,但搞乱UIButton
视图层次结构有点禁忌。
我遇到了图像没有按比例调整大小的问题,所以我修复它的方法是使用边缘插图。
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
改变UIButton.imageView.contentMode
对我不起作用。
我通过将图像设置为“背景”属性解决了这个问题。
如果需要,您可以添加比率约束
这与许多其他答案重叠,但我的解决方案是
- 将按钮的
contentMode
设置为- 这可以在 Interface Builder 的“用户定义的运行时属性”中完成(即,数字,1)或在子类中完成;UIImageView
.ScaleAspectFit
self.imageView.contentMode
UIButton
- 禁用“自动调整子视图”;
- 将“Edge”设置为“Image”,并为“Inset”设置适当的“Top”和“Bottom”值(仅当您像我一样使用 PDF 作为图像时才需要)。
您可以使用 imageWithCGImage 如上所示(但没有缺少括号)。
另外……数以百万计的非 4.0 手机根本无法使用该代码。
[button sizeToFit]
为我工作。
我有同样的问题,但我无法让它工作(也许这是 SDK 的一个错误)。
最后,作为一种解决方法,我UIImageView
在按钮后面放置了一个并设置了我想要的选项,然后简单地UIButton
在它上面放置了一个空白。