我有几个UIButtons,在IB中他们设置为Aspect Fit,但由于某种原因,他们总是拉伸。还有别的东西要设置吗?我尝试了所有不同的视图模式,但没有一个能够工作,它们都可以延伸。
答案 0 :(得分:218)
解决方案是在contentMode
的{{1}}属性上设置imageView
。必须使用自定义类型创建UIButton
才能使用此工作我相信(否则会为此属性返回UIButton
。)
答案 1 :(得分:47)
这种方法非常适合我。
在 Xib 中选择按钮并设置legendScrollView
:
user defined runtime attributes
self.imageView.contentMode
Number
我们使用数字,因为你不能在那里使用枚举。但是UIViewContentModeScaleAspectFit等于1。
答案 2 :(得分:42)
我以前遇到过这个问题。我通过将我的图片放在UIImageView
中来解决这个问题,其中contentMode
设置实际上有效,并将透明的自定义UIButton
置于其上方。
答案 3 :(得分:20)
如果您在Interface Builder中执行此操作,则可以使用运行时属性检查器直接设置它而无需任何代码。
将按钮上的键路径设置为“imageView.contentMode”,类型为“Number”,值为“1”(或者您想要的模式)。
答案 4 :(得分:12)
使用按钮的imageView for contentMode。不是直接在按钮上。
homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
答案 5 :(得分:6)
如果您将图片放在按钮后面的UIImageView
,则会失去UIButton
类的内置功能,例如adjustsImageWhenHighlighted
和{{ 1}},当然还有为不同状态设置不同图像的能力(没有自己动手做的事情)。
如果我们想要为所有控制状态取消保存图像,一个approuch是使用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:
,或者是任何想要适合的问题图像进入。
答案 6 :(得分:6)
我有一段时间没遇到这个问题。我遇到的问题是我试图将此效果应用于背景UIButton,这是有限的,因此意味着你无法轻松调整它。
诀窍是将其设置为图像然后应用@ ayreguitar的技术,这应该解决它!
UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
答案 7 :(得分:4)
将一些不同的答案组合成一个解决方案 - 创建一个自定义类型的按钮,设置按钮的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)
答案 8 :(得分:4)
这对我有用
[button.imageView setContentMode:UIViewContentModeScaleAspectFit];
感谢@ayreguitar的评论
答案 9 :(得分:4)
这里是swift的替代答案:
myButton.imageView?.contentMode = .ScaleAspectFit
答案 10 :(得分:3)
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
答案 11 :(得分:2)
此答案基于@WernerAltewischer's answer。
为了避免将我的按钮连接到IBOutlet以执行其上的代码,我将UIButton的类子类化:
// .h
@interface UIButtonWithImageAspectFit : UIButton
@end
// .m
@implementation UIButtonWithImageAspectFit
- (void) awakeFromNib {
[self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}
@end
现在在xib中创建一个自定义按钮,并设置其图像(而不是背景图像):
然后,设置其类:
你已经完成了!
而不是
按钮的图像宽高比现在符合预期:
答案 12 :(得分:1)
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()
}
}
答案 13 :(得分:1)
这与许多其他答案重叠,但我的解决方案是
contentMode
的{{1}}设置为UIImageView
- 这可以在Interface Builder中的“用户定义的运行时属性”中完成(即{{1}。 },Number,1)或.ScaleAspectFit
子类; 答案 14 :(得分:1)
我的图像没有按比例调整大小的问题所以我修复它的方法是使用边缘插入。
fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
答案 15 :(得分:1)
UIView内容模式适用于相应的CALayer的“内容”。这适用于UIImageView
,因为他们将CALayer
内容设置为相应的CGImage
。
drawRect:
最终呈现给图层内容。
自定义UIButton
(据我所知)没有内容(圆角矩形样式按钮可能使用内容呈现)。该按钮包含子视图:背景UIImageView
,图片UIImageView
和标题UILabel
。在子视图上设置contentMode
可能会做你想要的,但是弄乱UIButton
视图层次结构有点不可能。
答案 16 :(得分:0)
更改UIButton.imageView.contentMode
对我不起作用。
我通过将图片设置为“背景”属性来解决问题。
如果需要,可以添加比率约束
答案 17 :(得分:0)
[button sizeToFit]
为我工作。
答案 18 :(得分:0)
与@Guillaume类似,我创建了一个UIButton的子类作为Swift-File。然后在Interface Builder中设置我的自定义类:
这里是Swift文件:
import UIKit
class TRAspectButton : UIButton {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.imageView?.contentMode = .ScaleAspectFit
}
}
答案 19 :(得分:0)
您可以使用如上所示的imageWithCGImage(但没有丢失的括号)。
此外......数以百万计的非4.0手机根本无法使用该代码。
答案 20 :(得分:-1)
我有同样的问题,但我无法让它工作(也许这是SDK的一个错误)。
最后,作为解决方法,我在我的按钮后面添加了UIImageView
并在其上设置了我想要的选项,然后只需在其上放置一个空白UIButton
。