代码之家  ›  专栏  ›  技术社区  ›  James Skidmore

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

  •  15
  • James Skidmore  · 技术社区  · 15 年前

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

    5 回复  |  直到 7 年前
        1
  •  24
  •   James Skidmore    15 年前

    我猜UIButton不会将背景图像视为“内容”,因此内容模式不适用于背景图像。相反,我设置了按钮的图像,效果很好:

    [btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
    [btn setContentMode:UIViewContentModeCenter];
    
        2
  •  10
  •   Rémi Belzanti    10 年前

    在xib/情节提要的属性检查器中,您需要:

    1. 设定你的 UIButton 键入 Custom
    2. Image Background
    3. 通过验证步骤2,您可以看到按钮框根据图像集发生了更改。根据需要设置框架,图像将调整自身大小以适应
    4. 挑选 形象 为了财产 Edge 要将插入应用于按钮图像
    5. 输入所需的插入值。如果将5设置为 Top, Bottom, Left, Right ,图像将在按钮内居中,边框为5

    您可以在xib/storyboard视图中看到更改,无需启动调试。

    提示:按钮的每个图像的插图都是相同的( State Config

        3
  •  5
  •   Dan Grover    11 年前

    您还可以实现 - (CGRect)backgroundRectForBounds:(CGRect)bounds 控制背景的绘制方式。

        4
  •  1
  •   emkman    10 年前

    正确的解决方案是将类型从系统更改为自定义。然后,背景图像将遵循内容类型,而不仅仅是居中。在我的例子中,我将其设置为Aspect Fill,并应用45度角半径使其圆角。简单且工作完美。

        5
  •  0
  •   Brennan    10 年前

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