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

Jam*_*ore 15 iphone objective-c

这是我如何设置背景图像和内容模式:

[btn setBackgroundImage:[UIImage imageNamed:@"dots_game_horiz_blue.png"] 
               forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*ore 24

我猜UIButton不认为背景图像是"内容",因此内容模式不适用于背景图像.相反,我设置按钮的图像,它工作得很好:

[btn setImage:[[UIImage alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"dots_game_horiz_blue" ofType:@"png"]] forState:UIControlStateNormal];
[btn setContentMode:UIViewContentModeCenter];
Run Code Online (Sandbox Code Playgroud)

  • 设置内容模式实际上并没有在这里做任何事情.按钮图像自动居中,不缩放.尝试将其设置为除了居中之外的任何东西,看看我的意思. (3认同)
  • 这个解决方案的问题是UIButton有一个内部边距,所以如果图像不够小,它将被裁剪,即使它应该适合按钮内部. (2认同)
  • +1然而,不幸的是,如果你想拥有文字和图像,这将无法运作:-( (2认同)

Rém*_*nti 10

在xib/storyboard中的Attributes检查器中,您需要:

  1. 将您的UIButton类型设置为Custom
  2. 在房产中设置您的图像Image,而不是Background
  3. 验证步骤2,您可以看到根据图像集更改了按钮框.根据需要设置框架,图像将自行调整大小以适应
  4. 选择Image属性Edge以便将插入应用于按钮图像
  5. 输入您需要的插入值.如果将5设置为Top, Bottom, Left, Right,则图像将在按钮内居中,边框为5

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

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


小智 5

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

  • 这对我有用.我创建了一个自定义的UIButton类,并使用此代码使图像居中:` - (CGRect)backgroundRectForBounds:(CGRect)bounds {UIImage*bkgImage = [self backgroundImageForState:self.state]; if(bkgImage){CGFloat x = floorf((self.bounds.size.width-bkgImage.size.width)/ 2); CGFloat y = floorf((self.bounds.size.height-bkgImage.size.height)/ 2); return CGRectMake(x,y,bkgImage.size.width,bkgImage.size.height); } else return [super backgroundRectForBounds:bounds]; }` (3认同)