框架改变图像大小

时间:2015-01-10 16:26:39

标签: ios xcode image toolbar

我尝试将设置按钮添加到工具栏,但我必须为其设置的框架正在改变图像尺寸。如何在不弄乱图像本身的情况下设置框架。图像存储在@ 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;

} 

1 个答案:

答案 0 :(得分:1)

您有几种不同的选择。如果您不是绝对需要使按钮的尺寸与背景图像不同,那么您可以设置背景图像,然后获得不会拉伸该背景图像的尺寸,以指定按钮的框架,如:

[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:提供的方法{ {1}}。

如果由于某种原因你需要UIImage来拥有一个特定的框架并且你希望它的背景是不同的大小,你可以继承button0并在你的子类中明确地实现:

UIButton

并为背景图像返回正确大小的框架,无论按钮的边界如何。

当然,如果所有其他方法都失败了,您可以使用清晰的像素填充资源- (CGRect)backgroundRectForBounds:(CGRect)bounds ,以使图像大小与所需的帧大小相匹配。如果您可以避免使用此方法,我不建议使用该方法,因为它将导致对按钮尺寸的任何未来更改需要仔细更改图像(以及图像的2x和3x版本)。