帧改变图像大小

frame altering image size

我正在尝试将我的设置按钮添加到我的工具栏,但我必须为其设置的框架正在改变图像尺寸。我如何设置框架而不弄乱图像本身。图像存储在@1x、@2x 和@3x 的资产目录中。

-(void)viewWillAppear:(BOOL)animated{

 //Toolbar buttons
  UIView *buttonContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 44)];
  buttonContainer.backgroundColor = [UIColor clearColor];
  UIButton *button0 = [UIButton buttonWithType:UIButtonTypeCustom];
--[button0 setFrame:CGRectMake(0, 0, 44, 44)];-------------
  [button0 setBackgroundImage:[UIImage imageNamed:@"settings-128(1).png"] forState:UIControlStateNormal];
  [button0 addTarget:self action:@selector(button0Action:) forControlEvents:UIControlEventTouchUpInside];
  [button0 setShowsTouchWhenHighlighted:YES];
  [buttonContainer addSubview:button0];

  self.navigationItem.titleView = buttonContainer;

} 

您有几种不同的选择。如果您不是绝对需要使按钮的大小与其背景图像不同,则可以设置背景图像,然后获取不会拉伸该背景图像的大小,以分配给按钮的框架,例如:

[button0 setBackgroundImage:[UIImage imageNamed:@"settings-128(1).png"] forState:UIControlStateNormal];
const CGSize button0Size = [button0 sizeThatFits:CGSizeZero];
[button0 setFrame:CGRectMake(0, 0, button0Size.width, button0Size.height)];

如果您真的想在不失真的情况下更改背景图像的大小(例如,您可能想通过复制其中心的像素来拉长背景图像),您应该查看提供的 resizableImageWithCapInsets: 方法通过 UIImage.

如果出于某种原因你需要 button0 有一个特定的框架并且你希望它的背景大小不同,你可以继承 UIButton 并在你的子类中显式实现:

- (CGRect)backgroundRectForBounds:(CGRect)bounds

和 return 为您的背景图像提供大小正确的框架,而不考虑按钮的边界。

当然,如果一切都失败了,您可以用清晰的像素填充您的资源 settings-128(1).png,使图像大小与所需的帧大小相匹配。如果可以避免的话,我不推荐这种方法,因为它会导致将来对按钮大小的任何更改都需要仔细更改图像(以及图像的 2x 和 3x 版本)。