UIButton不听内容模式设置?

Dan*_*Ray 89 uibutton contentmode ios

firstButton是Custom类型的UIButton.我以编程方式将三个放在一个表的每个单元格中,因此:

[firstButton setImage:markImage forState:UIControlStateNormal];
[firstButton setContentMode:UIViewContentModeScaleAspectFit];
[cell.contentView addSubview:firstButton];
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*ave 185

我有同样的问题.我看到这个问题有点老了,但是我想提供一个明确而正确的答案来保存其他人(比如我)在搜索结果中弹出的时候.

它花了我一些搜索和实验,但我找到了解决方案.只需设置UIButton中"隐藏"ImageView的ContentMode即可.

[[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
[firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
Run Code Online (Sandbox Code Playgroud)

也许这就是丹雷在他接受的答案中提到的,但我怀疑不是.

  • 请参阅下面的Chris Nolet解决方案:button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop; (4认同)
  • 只是为了澄清,"不起作用"的意思是"图像以其全分辨率显示,而不是像我希望的那样按比例缩小". (2认同)

Alf*_*sen 67

如果您正在处理UIButton的图像(而不是它的backgroundImage),则在UIButton本身或其imageView上设置contentMode没有任何效果(尽管其他答案如此).

或者这样做:

self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
Run Code Online (Sandbox Code Playgroud)

或相应调整图像大小.

或者只使用附加了UITapGestureRecognizer的UIImageView(正确地尊重contentMode),或者使用透明的UIButton.

  • 设置contentHorizo​​ntalAlignment和contentVerticalAlignment是正确的解决方案.有关说明,请参见http://stackoverflow.com/a/28205566/481207. (5认同)
  • 这适用于iOS 7中的情况,而其他所有情况则不适用. (4认同)
  • 为我工作.这应该是公认的答案. (3认同)
  • 这个答案是不正确的.如果您想进行任何类型的方面填充或拟合,您*需要在`imageView`上设置`contentMode`,因为其他答案已经澄清.请参阅:/sf/answers/556102151/. (3认同)

Chr*_*let 47

而不是设置contentMode按钮本身,你要设置contentHorizontalAlignmentcontentVerticalAlignment性能,(关键)的contentMode该按钮的imageView任何种类方面的填充或配合.这是一个例子:

button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
button.imageView.contentMode = UIViewContentModeScaleAspectFit;
Run Code Online (Sandbox Code Playgroud)

当然,您还可以执行其他操作,例如将按钮的图像对齐到按钮的顶部.如果您不需要填充或适合宽高比,则可以单独设置对齐:

button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
Run Code Online (Sandbox Code Playgroud)

在Swift中,你会想要使用:

button.contentHorizontalAlignment = .fill
button.contentVerticalAlignment = .fill
button.imageView?.contentMode = .scaleAspectFit
Run Code Online (Sandbox Code Playgroud)

这适用于所有iOS版本,包括具有自动布局的最新版本(即iOS 4至iOS 11+).

  • 谢谢克里斯 - 这解决了我的问题,或者更确切地说,它与contentEdgeInsets结合使用,以便将我的图像从顶部边缘稍微支持一下. (2认同)

Pie*_*rre 7

经过几个小时的混乱,这就是我在iOS 3.2下工作的方式.正如dusker所提到的,使用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];
Run Code Online (Sandbox Code Playgroud)

  • 我无法在iOS 5.1上使用此解决方案. (3认同)

Dan*_*Ray 6

答案是使用具有所需的所有可爱内容模式设置的UIImageView,然后在其上层叠自定义按钮.愚蠢,你不能一次性完成所有这一切,但似乎你不能.


del*_*lat 6

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

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

人们应该始终尝试在故事板而不是代码中进行设置。