110

我有几个 UIButton,在 IB 中它们设置为 Aspect Fit,但由于某种原因,它们总是在拉伸。你还有什么需要设置的吗?我尝试了所有不同的视图模式,但它们都不起作用,它们都在拉伸。

4

21 回答 21

243

解决方法是设置 的contentModeonimageView属性UIButton。我相信必须使用UIButton自定义类型创建它才能工作(否则nil返回此属性)。

于 2010-10-22T10:10:12.810 回答
63

这种方法对我很有效。:

Xib中选择按钮并设置user defined runtime attributes

  • 关键路径:self.imageView.contentMode
  • 类型:Number
  • 价值:1

点击这里查看更清晰的解决方案

我们使用数字是因为你不能在那里使用枚举。但是 UIViewContentModeScaleAspectFit 等于 1。

于 2016-03-08T09:35:10.403 回答
46

我以前也遇到过这个问题。我解决了这个问题,把我的图像放在一个设置实际起作用的UIImageView地方contentMode,并在上面放置一个透明的自定义UIButton

编辑:这个答案已经过时了。有关现代版本 iOS 中的正确答案,请参阅@Werner Altewischer 的答案

于 2010-08-11T17:02:26.303 回答
23

如果您在 Interface Builder 中执行此操作,则可以使用运行时属性检查器直接设置它而无需任何代码。

将按钮上的键路径设置为“imageView.contentMode”,类型为“Number”,值为“1”(或您想要的任何模式)。

imageview.contentMode = 1

于 2017-02-10T22:42:02.290 回答
17

将按钮的 imageView 用于 contentMode。不是直接在按钮本身上。

homeButton.imageView.contentMode = UIViewContentModeScaleAspectFit;
homeButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
homeButton.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
[homeButton setImage:[UIImage imageNamed:kPNGLogo] forState:UIControlStateNormal];
于 2016-09-11T20:30:25.990 回答
6

如果您将图像放在UIImageView按钮后面,您将失去类的内置功能UIButton,例如adjustsImageWhenHighlightedand 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:,或者任何人想要将图像放入其中。

于 2010-12-14T13:17:39.450 回答
6

我前段时间遇到过这个问题。我遇到的问题是我试图将此效果应用于有限的背景 UIButton,因此意味着您无法轻松调整它。

诀窍是将其设置为图像,然后应用@ayreguitar 的技术,这应该可以解决它!

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setContentMode:UIViewContentModeScaleAspectFill];
[myButton setImage:@"myImage.png" forState:UIControlStateNormal];
于 2013-11-04T01:33:59.143 回答
4

这对我有用

[button.imageView setContentMode:UIViewContentModeScaleAspectFit];

感谢@ayreguitar 的评论

于 2015-03-19T07:26:35.163 回答
4

这是swift的替代答案:

myButton.imageView?.contentMode = .ScaleAspectFit
于 2015-11-29T16:04:21.697 回答
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)
于 2016-10-18T22:51:02.937 回答
3

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()


    }

}
于 2015-02-10T14:53:51.957 回答
3
btn.imageView.contentMode = UIViewContentModeScaleAspectFit;
于 2016-03-18T08:06:04.747 回答
2

此答案基于@WernerAltewischer 的答案

为了避免将我的按钮连接到 IBOutlet 以在其上执行代码,我对 UIButton 的类进行了子类化:

// .h
@interface UIButtonWithImageAspectFit : UIButton
@end

// .m
@implementation UIButtonWithImageAspectFit

- (void) awakeFromNib {
    [self.imageView setContentMode:UIViewContentModeScaleAspectFit];
}

@end



现在在您的 xib 中创建一个自定义按钮,并设置其图像(不是背景图像):

UIButtonWithImageAspectFit:创建和设置图像


然后,设置它的类:

UIButtonWithImageAspectFit:设置自定义类

你完成了! 现在正如预期的那样
,而不是按钮的图像方面适合:
不适合图像方面的 UIButton

适合图像纵横比的 UIButton

于 2014-06-26T09:10:52.087 回答
1

UIView 内容模式适用于对应的 CALayer 的“内容”。这适用于UIImageViews 因为他们将CALayer内容设置为相应的CGImage.

drawRect:最终渲染到图层内容。

自定义UIButton(据我所知)没有内容(圆角矩形样式按钮可能使用内容呈现)。该按钮具有子视图:背景UIImageView、图像UIImageView和标题UILabel。在子视图上设置contentMode可能会做你想做的事,但搞乱UIButton视图层次结构有点禁忌。

于 2010-08-11T18:18:34.763 回答
1

我遇到了图像没有按比例调整大小的问题,所以我修复它的方法是使用边缘插图。

fooButton.contentEdgeInsets = UIEdgeInsetsMake(10, 15, 10, 15);
于 2012-06-07T07:45:33.377 回答
1

改变UIButton.imageView.contentMode对我不起作用。
我通过将图像设置为“背景”属性解决了这个问题。
如果需要,您可以添加比率约束

于 2015-12-24T02:53:59.627 回答
1

这与许多其他答案重叠,但我的解决方案是

  • 将按钮的contentMode设置为- 这可以在 Interface Builder 的“用户定义的运行时属性”中完成(即,数字,1)或在子类中完成;UIImageView.ScaleAspectFitself.imageView.contentModeUIButton
  • 禁用“自动调整子视图”;
  • 将“Edge”设置为“Image”,并为“Inset”设置适当的“Top”和“Bottom”值(仅当您像我一样使用 PDF 作为图像时才需要)。
于 2016-05-17T16:57:40.120 回答
0

您可以使用 imageWithCGImage 如上所示(但没有缺少括号)。

另外……数以百万计的非 4.0 手机根本无法使用该代码。

于 2010-12-20T04:47:27.603 回答
0

[button sizeToFit]为我工作。

于 2012-07-17T15:42:32.673 回答
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
    }
}
于 2016-08-09T13:38:21.640 回答
-1

我有同样的问题,但我无法让它工作(也许这是 SDK 的一个错误)。

最后,作为一种解决方法,我UIImageView在按钮后面放置了一个并设置了我想要的选项,然后简单地UIButton在它上面放置了一个空白。

于 2010-08-11T17:03:57.370 回答