以下是我设置背景图片和内容模式的方法:
[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"]
forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
是否存在背景图像像素化的原因?框架略大于图像尺寸,我只想让图像居中。
答案 0 :(得分:24)
我猜UIButton不认为背景图像是“内容”,因此内容模式不适用于背景图像。相反,我设置按钮的图像,它工作得很好:
[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
答案 1 :(得分:10)
在xib / storyboard中,在Attributes检查器中,您需要:
UIButton
类型设置为Custom
Image
中设置您的图片,而不是Background
Image
选择Edge
,以便将插入内容应用于按钮图片Top, Bottom, Left, Right
,图像将在按钮内居中,边框为5 您可以在xib / storyboard视图中看到更改,无需启动调试。
提示:按钮(State Config
)
答案 2 :(得分:5)
您还可以实施- (CGRect)backgroundRectForBounds:(CGRect)bounds
来控制背景的绘制方式。
答案 3 :(得分:1)
正确的解决方案是将类型从“系统”更改为“自定义”。然后,背景图像将遵循内容类型而不仅仅是居中。在我的情况下,我将其设置为Aspect Fill并应用45度角半径来围绕它。简单而且完美。
答案 4 :(得分:0)
我需要为头像照片创建圆形按钮,并找到这个问题的答案,但他们并没有让我一路走来。我实现了backgroundRectForBounds
方法并缩放图像以适应它并且效果很好。
我在GitHub上有代码。
https://github.com/brennanMKE/CircleButton
该方法也列在下面。设置背景图像非常重要,而不是使用此方法无效的按钮图像。
- (CGRect)backgroundRectForBounds:(CGRect)bounds {
UIImage *backgroundImage = [self backgroundImageForState:self.state];
if (backgroundImage) {
CGFloat maxWidth = CGRectGetWidth(self.frame);
CGFloat xDelta = maxWidth / backgroundImage.size.width;
CGFloat yDelta = maxWidth / backgroundImage.size.height;
CGFloat delta = xDelta > yDelta ? xDelta : yDelta;
CGFloat x = floorf((self.bounds.size.width - (backgroundImage.size.width * delta)) / 2);
CGFloat y = floorf((self.bounds.size.height - (backgroundImage.size.height * delta)) / 2);
return CGRectMake(x, y, backgroundImage.size.width * delta, backgroundImage.size.height * delta);
}
else {
return [super backgroundRectForBounds:bounds];
}
}