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
,你将需要设置contentHorizontalAlignment
和contentVerticalAlignment
属性,以及(关键地)设置button的imageView
的contentMode
以进行任何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了一个解决这个问题。 将UIButton
的adjustsImageWhenHighlighted
属性设置为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视网膜。