当UIButton内容模式为“中心”时,背景图像会像素化

时间:2009-08-05 20:43:27

标签: iphone objective-c

以下是我设置背景图片和内容模式的方法:

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
               forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];

是否存在背景图像像素化的原因?框架略大于图像尺寸,我只想让图像居中。

5 个答案:

答案 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检查器中,您需要:

  1. UIButton类型设置为Custom
  2. 在属性Image中设置您的图片,而不是Background
  3. 验证步骤2,您可以看到根据图像集更改了按钮框。根据需要设置框架,图像将自行调整大小以适合
  4. 为属性Image选择Edge,以便将插入内容应用于按钮图片
  5. 输入您需要的插入值。如果将5设置为Top, Bottom, Left, Right,图像将在按钮内居中,边框为5
  6. 您可以在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];
    }
}