UIButton不听内容模式设置?

firstButton是一个types为Custom的UIButton。 我以编程方式将它们中的三个放在表格的每个单元格中,因此:

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

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

我有同样的问题。 我看到这个问题有点老,但是我想提供一个清晰而正确的答案,以便在search结果中popup一些其他人(如我)。

这花了我一些search和试验,但我find了解决scheme。 只需设置UIButton内的“隐藏”ImageView的ContentMode即可。

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

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

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

或者做这个,而不是:

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

或相应地调整您的图像

或者只是使用UIImageView(正确地尊重contentMode)连接到它的UITapGestureRecognizer,或者在它上面使用一个透明的UIButton。

而不是在button本身上设置contentMode ,你将需要设置contentHorizontalAlignmentcontentVerticalAlignment属性,以及(关键地)设置button的imageViewcontentMode以进行任何types的填充或贴合。 这是一个例子:

 button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; button.imageView.contentMode = UIViewContentModeScaleAspectFit; 

当然,你也可以做其他的事情,比如将button的图像alignmentbutton的顶部:

 button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop; 

在Swift中,你需要使用:

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

这适用于所有版本的iOS,包括带有自动布局的最新版本(即iOS 4到iOS 11+)。 希望这有助于节省一些时间!

答案是使用一个UIImageView与所有可爱的内容模式设置你想要的,然后层上一个自定义button。 愚蠢的是,你不可能一口气做到这一切,但似乎你不能。

经过几个小时的困惑之后,下面是我如何在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]; 

find了一个解决这个问题。 将UIButtonadjustsImageWhenHighlighted属性设置为NO

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

希望这可以帮助。 随意评论下面,我会跟进你有任何问题。

只有解决scheme为我工作:

 [button setImage:image forState:UIControlStateNormal]; button.imageView.contentMode = UIViewContentModeScaleAspectFill; button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill; button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill; 

我的答案类似于库巴的答案。 我需要我的形象编程设置。

 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; } 

而不是setImage尝试setBackgroundImage

我相信我们在这里有一个简单的界面生成器问题 – 显然IB在设置图像属性后忽略任何内容模式更改。

解决方法非常简单:设置内容模式,删除以前设置的图像名称(确保在所有状态下将其删除,默认,突出显示等),然后在所有需要的状态下重新input所需的图像名称。 。

Swift 3

 self.firstButton.imageView?.contentMode = .scaleAspectFill 

我也build议看看adjustsImageWhenHighlighted UIButton属性,以避免在按下button时出现奇怪的图像变形。

在试图解决这个问题时,随着时间的推移,我的方法变得有些黑客了,而且我最终搞清了UIButton的子类化和重写集合。

对我来说,它只能将alpha图像压缩到.5,因为它们在黑色的背景上。

然而,只有当我注释掉[super setHighlighted:](它出现的是图像可伸缩代码正在进行的时候),它才会起作用,这只是不觉得解决这个问题的正确方法…一切似乎都是虽然工作正常。 当我继续努力的时候,我们会看到它是如何成立的。

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

如果有人在iOS 6和iOS 7以及故事板中寻找答案:

您可以在故事板中设置图像:

在这里输入图像说明

接着:

 for(UIView* testId in self.subviews) { if([testId isKindOfClass:[UIImageView class]]) [testId setContentMode:UIViewContentModeScaleAspectFill]; } 

如果UIButton似乎没有收听布局约束设置,请检查图像是否大于button大小。 总是使用@ 2x和@ 3x图像来parsing视网膜。

Interesting Posts