95

firstButton 是自定义类型的 UIButton。我以编程方式将其中三个放在表格的每个单元格中,因此:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];

在其他地方,我告诉它clipToBounds。我得到的是图像中心正方形的裁剪,而不是它的纵横比渲染。我已经尝试了很多方法,包括在 firstButton.imageView 上设置 mode 属性,这似乎也不起作用。

4

17 回答 17

188

我有同样的问题。我看到这个问题有点老了,但我想提供一个清晰而正确的答案,以节省其他人(比如我)在搜索结果中弹出的时间。

我花了一些时间搜索和试验,但我找到了解决方案。只需设置 UIButton 内的“隐藏”ImageView 的 ContentMode。

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];

也许这就是丹·雷在他接受的答案中所暗示的,但我怀疑不是。

于 2010-07-19T13:14:54.560 回答
77

如果您正在处理 UIButton 的图像(而不是 backgroundImage),则在 UIButton 本身或其 imageView 上设置 contentMode 无效(尽管其他答案说)。

或者改为这样做:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;

或相应地调整图像大小。

或者只使用一个 UIImageView(它正确地尊重 contentMode),并附有一个 UITapGestureRecognizer,或者在它上面有一个透明的 UIButton。

于 2014-03-04T22:29:24.287 回答
59

而不是设置contentMode按钮本身,您需要设置contentHorizontalAlignmentcontentVerticalAlignment属性以及(至关重要)contentMode按钮的imageView任何类型的方面填充或适合:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit

您还可以执行其他操作,例如将按钮的图像与顶部对齐。如果您不需要方面填充或适合,您可以自行设置对齐方式:

button.contentVerticalAlignment = .top
于 2011-10-30T10:09:43.477 回答
7

经过几个小时的困惑,这就是我如何让它在 iOS 3.2 下工作。正如黄昏者所提到的,使用 setBackgroundImage 而不是 setImage 为我完成了这项工作。

CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];

[myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
[myButton setFrame: myButtonFrame];
[myButton setContentMode: UIViewContentModeScaleAspectFit];
于 2010-10-02T14:20:54.260 回答
6

答案是使用 UIImageView 和你想要的所有可爱的内容模式设置,然后在它上面放置一个自定义按钮。愚蠢的是,你不能一口气做到这一点,但看起来你做不到。

于 2010-06-04T14:52:44.253 回答
5

这两件事(最初很难找到)将拉伸您的 UIButton 图像以适应按钮大小:

在此处输入图像描述 在此处输入图像描述

应该始终尝试在情节提要而不是代码中进行设置。

于 2019-12-12T21:28:30.880 回答
4

找到了解决此问题的方法。将 的adjustsImageWhenHighlighted属性设置UIButtonNO

  UIButton *b = [[UIButton alloc] initWithFrame:rect];
        [b setImage:image forState:UIControlStateNormal];
        [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
        [b setAdjustsImageWhenHighlighted:NO];

希望这可以帮助。欢迎在下方评论,我会跟进您的任何问题。

于 2012-06-10T04:44:54.420 回答
4

我的回答与库巴的相似。我需要以编程方式设置我的图像。

UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
[button setBackgroundImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
for(UIView *view in button.subviews) {
    view.contentMode = UIViewContentModeScaleAspectFill;
}
于 2014-03-06T07:22:37.117 回答
3

唯一对我有用的解决方案:

[button setImage:image forState:UIControlStateNormal];
button.imageView.contentMode = UIViewContentModeScaleAspectFill;
button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
于 2015-07-14T12:10:41.110 回答
3

斯威夫特 3

self.firstButton.imageView?.contentMode = .scaleAspectFill
于 2017-09-05T06:41:57.153 回答
1

而不是 setImage 尝试 setBackgroundImage

于 2010-06-01T14:48:25.320 回答
1

我相信我们在这里有一个简单的界面构建器问题 - 显然,在您设置图像属性之后,IB 会忽略任何内容模式更改。

解决方案很简单:设置内容模式,删除以前设置的图像名称(确保在所有状态下删除它,默认,突出显示等),然后在所有所需状态中重新输入所需的图像名称 - 等等.

于 2013-01-19T20:18:37.733 回答
1

对于在 iOS 15 和 Xcode 13 上遇到此问题的任何人,请参阅Matt 在 this other question 中的回答

Xcode 的行为发生了变化,现在将库中的 UIButtons 默认设置为plain样式,这会阻止子图像按预期缩放。

于 2021-10-22T02:02:58.927 回答
0

我还建议查看adjustsImageWhenHighlighted UIButton属性以避免按下按钮时图像的奇怪变形。

于 2010-10-07T16:54:20.647 回答
0

在试图解决这个问题时,随着时间的推移,我的方法变得有点老套了,我最终继承了 UIButton 并覆盖了 setHighlighted:

对我来说,只需将图像 alpha 降低到 0.5,因为它们位于黑色背景上。

但是,它只有在我注释掉 [super setHighlighted:] 时才有效(它似乎正在执行图像拉伸代码),这根本不是解决这个问题的正确方法......一切似乎都是不过,工作正常。在我继续努力的过程中,我们会看到它是如何保持的。

- (void)setHighlighted:(BOOL)highlight {
    if (highlight) {
        [self.imageView setAlpha:.5];
    }  else {
        [self.imageView setAlpha:1];        
    }

//    [super setHighlighted:highlight];
}
于 2012-02-28T21:19:50.187 回答
0

如果有人正在寻找适用于 iOS 6 和 iOS 7 以及情节提要的答案:

您可以在情节提要中设置图像:

在此处输入图像描述

进而:

for(UIView* testId in self.subviews) {
    if([testId isKindOfClass:[UIImageView class]])
        [testId setContentMode:UIViewContentModeScaleAspectFill];
}
于 2013-06-21T14:01:37.030 回答
0

如果 UIButton 似乎不听布局约束设置,请检查图像是否大于按钮大小。始终将@2x 和@3x 图像用于视网膜分辨率。

于 2016-09-20T04:56:45.380 回答