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